注意事項: 我想如果你想使用 alloca, 你應該要看一下
1. http://www.gnu.org/software/libtool/manual/libc/Disadvantages-of-Alloca.html
2. 8.27 alloca() 是什麼?為什麼不提倡使用它
這東西比 new 或 malloc 快多了, 因為上面的兩個 functions 都是使用 heap 的方式建立記憶體,
以我有限的知識來說, 這是最慢而且相當耗資源的方法.
最重要的是你還可能忘記釋放記憶體, 造成 memory leak 的問題.
而 alloca 直接在 stack 上配置記憶體, 所以不用特別呼叫 free 或 del, 離開 function 後, 自動歸還.
對於暫存資料方面, 相當方便好用.
例如: 你的資料需要一連串的動作才會產生出來, 那麼中間資料的空間就可以用這玩意兒幫你配置. 相當有效率.
-----------------------------------------------------------------------------------
使用上, 必須注意的是用 alloca 配置的記憶體在 function 結束後, 就會消失.
-----------------------------------------------------------------------------------
所以如果你的資料還要留著繼續後面的處理時,
請使用參考延伸閱讀 1 等記憶體配置技巧.
下面是最簡單的範例:
回家試試看, 看能不能使你的程式更有效率. Enjoy.
by Jing
延伸閱讀
http://jpkc.cqit.edu.cn/jpkc/07/%E4%B8%8B%E8%BD%BD%E8%B5%84%E6%96%99/C%20%E8%AF%AD%E8%A8%80%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E9%9B%86/node121.html
回覆刪除謝謝你幫我們加強, alloca 使用上要注意的地方.
回覆刪除仔細看一下他的建議, 似乎都是針對想把 alloca 當一般配置記憶來使用
1. 不具有移植性:
=> 我想如果你確定你的程式執行平台, 應該就可以用 alloca. 另外, 只要是有提供 GNU 系統的平台, 都有實做 alloca, 只是對不同平台有不同效率問題.
另外, 在 8.27 alloca() 是什麼?為什麼不提倡使用它? 文章中提到的第二項:
回覆刪除把配置的記憶體直接當參數傳遞時會遭遇的問題.
例如: fgets(alloca(100), 100, stdin)
=> 這樣寫法我一開始看不懂這會有什麼問題. 我猜會不會是參數配置也是用 Stack, 而 alloca 也是用 stack 當前的 top, 這樣會造成的問題.
另外, 如果不做任何例外防護, 發生 stack overflow 也會出問題.
這樣直接將把 alloca 放在 function 的參數列中配置記憶體, 有可能會因為堆疊配置的關係, 造成 memory leak 的問題. 這部分要把他的組合語言實做看一下才會明朗.
老實說, 如果有高手經過, 還請幫忙回答一下..
用 man alloca 看了一下說明後, 應該只是考量到移植性的問題, 因為不同 platform 或不同的 compiler 對 stack 的處理可能會不一樣
回覆刪除另外我也覺的 alloca 是弊大於利, 如果不是 critical path, 直接用 malloc 就好. 真的有速度的考量時, 再換成 local variable 處理也不會太麻煩.
另外.. 我只是路過的大學同學:p
是紹甫嗎? 希望我沒有記錯, 真不好意思, 讓您出手了.
回覆刪除最近好嗎?
希望路過的你, 順利平坦.
呵~ 我的id真的很好猜:p
回覆刪除讓我們一起召喚同學會吧 ^^|