堆疊與堆積的差異:比較記憶體區域的使用方式
執行中的程式主要使用兩個記憶體區域來存放資料。堆疊存放函式呼叫的框架,也就是區域變數、引數與返回位址。它由系統自動管理,速度非常快,但很小,且受限於函式呼叫的生命週期。堆積存放程式以 malloc 或 new 等方式明確要求的記憶體,會一直存活到被釋放為止。堆積靈活且大,但較慢,記憶體洩漏與碎片化也都發生在這裡。
| 項目 | 堆疊 | 堆積 |
|---|---|---|
| 用途 | 函式呼叫的框架。區域變數、引數、返回位址 | 生命週期比函式長,或大小事先不明的動態配置資料 |
| 配置方式 | 自動。每次呼叫與返回時,堆疊指標會移動 | 明確。malloc 與 free、new 與 delete,或垃圾回收器 |
| 速度 | 非常快。只是移動指標 | 較慢。配置器要尋找空閒區塊,並管理記錄 |
| 生命週期 | 直到函式返回為止 | 直到記憶體被釋放(或被垃圾回收)為止 |
| 大小 | 有限(通常每個執行緒數 MB) | 上限只有可用的記憶體量 |
| 位置 | 通常從高位址向下成長 | 通常從低位址向上成長。兩者朝彼此成長 |
| 碎片化 | 無 | 可能發生。反覆配置與釋放會留下無法使用的空隙 |
| 執行緒 | 每個執行緒都有專用的堆疊 | 由所有執行緒共用,所以配置器必須是執行緒安全的 |
| 常見錯誤 | 因深層遞迴或大型區域陣列造成的堆疊溢位 | 記憶體洩漏、釋放後使用、重複釋放、記憶體不足 |
數值為具代表性的大致參考值,會因世代或產品而異。