2008年7月20日 星期日

[C++] 高效率記憶體配置 -- alloca

注意事項:  我想如果你想使用 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 等記憶體配置技巧.

 

下面是最簡單的範例:

  alloca.cpp 完整專案

 

回家試試看, 看能不能使你的程式更有效率. Enjoy.

 

by Jing

 

延伸閱讀

1. Windows 記憶體管理觀念與使用方式

6 則留言:

  1. 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

    回覆刪除
  2. 謝謝你幫我們加強, alloca 使用上要注意的地方.

    仔細看一下他的建議, 似乎都是針對想把 alloca 當一般配置記憶來使用

    1. 不具有移植性:
    => 我想如果你確定你的程式執行平台, 應該就可以用 alloca. 另外, 只要是有提供 GNU 系統的平台, 都有實做 alloca, 只是對不同平台有不同效率問題.

    回覆刪除
  3. 另外, 在 8.27 alloca() 是什麼?為什麼不提倡使用它? 文章中提到的第二項:

    把配置的記憶體直接當參數傳遞時會遭遇的問題.
    例如: fgets(alloca(100), 100, stdin)

    => 這樣寫法我一開始看不懂這會有什麼問題. 我猜會不會是參數配置也是用 Stack, 而 alloca 也是用 stack 當前的 top, 這樣會造成的問題.

    另外, 如果不做任何例外防護, 發生 stack overflow 也會出問題.

    這樣直接將把 alloca 放在 function 的參數列中配置記憶體, 有可能會因為堆疊配置的關係, 造成 memory leak 的問題. 這部分要把他的組合語言實做看一下才會明朗.

    老實說, 如果有高手經過, 還請幫忙回答一下..

    回覆刪除
  4. 用 man alloca 看了一下說明後, 應該只是考量到移植性的問題, 因為不同 platform 或不同的 compiler 對 stack 的處理可能會不一樣

    另外我也覺的 alloca 是弊大於利, 如果不是 critical path, 直接用 malloc 就好. 真的有速度的考量時, 再換成 local variable 處理也不會太麻煩.

    另外.. 我只是路過的大學同學:p

    回覆刪除
  5. 是紹甫嗎? 希望我沒有記錯, 真不好意思, 讓您出手了.

    最近好嗎?

    希望路過的你, 順利平坦.

    回覆刪除
  6. 呵~ 我的id真的很好猜:p
    讓我們一起召喚同學會吧 ^^|

    回覆刪除