
338
|
第九章
system bytes = 3216519168
in use bytes = 3202567912
max mmap regions = 65536
max mmap bytes = 2350579712
基於堆疊的分配
目前我們已探討過的動態記憶體分配機制,都是使用堆積或記憶體映射來取得動態記
憶體。我們的預期也應該是這樣,因為堆積與記憶體映射本質上就是動態決定的。堆
疊(stack)是程式的位址空間中另一個常見的資料結構,用於存放程式的
自動變數
(
automatic variables
)。
然而,沒有理由說,一個程式設計者無法為動態記憶體分配使用堆疊。只要分配的結果
不會造成堆疊溢位(overflow),此類做法應該很容易,而且應該可以執行得相當好。要
從堆疊進行動態記憶體分配,可以使用
alloca()
系統呼叫:
#include <alloca.h>
void * alloca (size_t size);
執行成功時,
alloca()
會傳回一個指標,指向
size
個位元組的記憶體(空間)。此記憶
體(空間)位於堆疊之上,而且進行調用的函式返回時會自動釋出。有些實作會在執行
失敗時傳回
NULL
,但是多數的
alloca()
實作不會失敗,或者無法回報失敗的情況。失敗
的原因只可能是堆疊溢位。
用法如同
malloc()
,然而你不需要(的確,不必)釋出所分配的記憶體。下面的例子是
一個函式,此函式會在系統的組態目錄(可能是
/etc
,不過如果要移植到其他系統最好
在編譯時期決定)中開啟所指定的檔案。此函式會分配一個新的緩衝區,把系統組態目 ...