_alloca 與 _malloca 的區別

_alloca 總是分配在 stack 上 (VC 預設 stack size 為 1MB)。 若分配成功, […]


_alloca

總是分配在 stack 上 (VC 預設 stack size 為 1MB)。
若分配成功,
則呼叫 _alloca 之函數區塊結尾處,
此記憶體區塊將被自動釋放,
並且禁止使用諸如 free 等方式釋放 _alloca 所分配之記憶體;
若分配失敗,
則產生一個 stack overflow exception,
此例外並非 C++ exception,
須使用 Windows Structured Exception Handling (SEH) 捕獲此例外。

_malloca

並不總是分配在 stack 上。
如果請求的 size 超過 _ALLOCA_S_THRESHOLD,
則 _malloca 嘗試在 heap 上分配記憶體;
如果請求的 size 小於或等於 _ALLOCA_S_THRESHOLD,
則嘗試在 stack 上分配。
並且如果在 stack 上分配失敗,
則產生一個 stack overflow exception,
須使用 SEH 進行捕獲。
與 _alloca 不同之處在於:
由於 _malloca 無法保證必然分配在 stack 上,
因此記憶體並不會在呼叫的函數區塊結尾處被自動釋放,
必須總是透過 _freea 手動釋放 _malloca 所分配之記憶體區塊。