棧和堆的對(duì)比
在C、C 中,內(nèi)存可以被分為四個(gè)區(qū)域:棧、堆、全局/靜態(tài)存儲(chǔ)區(qū)和常量存儲(chǔ)區(qū)。這里我們將重點(diǎn)討論棧和堆的對(duì)比。1)棧棧通常用于存儲(chǔ)那些在編譯期間就能確定存儲(chǔ)大小的變量。它是函數(shù)作用域內(nèi)創(chuàng)建的,并且在離
在C、C 中,內(nèi)存可以被分為四個(gè)區(qū)域:棧、堆、全局/靜態(tài)存儲(chǔ)區(qū)和常量存儲(chǔ)區(qū)。這里我們將重點(diǎn)討論棧和堆的對(duì)比。
1)棧
棧通常用于存儲(chǔ)那些在編譯期間就能確定存儲(chǔ)大小的變量。它是函數(shù)作用域內(nèi)創(chuàng)建的,并且在離開作用域后自動(dòng)銷毀的變量的存儲(chǔ)區(qū)。棧的存儲(chǔ)空間是連續(xù)的,相鄰定義的局部變量的存儲(chǔ)空間也是相鄰的。棧的大小是有限的,默認(rèn)情況下,Visual C 編譯器的棧大小為1MB。
2)堆
堆通常用于存儲(chǔ)在編譯期間無法確定存儲(chǔ)大小的變量。堆的存儲(chǔ)空間是不連續(xù)的,使用malloc(或new)函數(shù)來分配內(nèi)存塊,并且需要使用free(或delete)函數(shù)釋放內(nèi)存。如果沒有正確釋放內(nèi)存,就會(huì)出現(xiàn)內(nèi)存泄漏問題。另外,堆中分配的內(nèi)存塊并不一定是相鄰的,可能會(huì)導(dǎo)致內(nèi)存碎片。理論上,每個(gè)程序最大可達(dá)到4GB。
全局/靜態(tài)存儲(chǔ)區(qū)和常量存儲(chǔ)區(qū)的對(duì)比
3)全局/靜態(tài)存儲(chǔ)區(qū)
全局/靜態(tài)存儲(chǔ)區(qū)主要用于存儲(chǔ)在整個(gè)程序運(yùn)行期間都可見的全局變量和靜態(tài)變量。和棧一樣,全局/靜態(tài)存儲(chǔ)區(qū)適用于在編譯期間就能確定存儲(chǔ)大小的變量。
4)常量存儲(chǔ)區(qū)
常量存儲(chǔ)區(qū)也與全局/靜態(tài)存儲(chǔ)區(qū)類似,但它主要用于存儲(chǔ)在編譯期間就能確定存儲(chǔ)大小的常量。在程序運(yùn)行期間,存儲(chǔ)區(qū)內(nèi)的常量是全局可見的。常量存儲(chǔ)區(qū)內(nèi)的值不能修改。
總結(jié)
根據(jù)上述內(nèi)容,我們可以得出以下結(jié)論:
- 棧和堆用于存儲(chǔ)變量,棧適用于編譯期間能確定大小的變量,而堆適用于運(yùn)行時(shí)動(dòng)態(tài)分配內(nèi)存的變量。
- 全局/靜態(tài)存儲(chǔ)區(qū)和常量存儲(chǔ)區(qū)同樣適用于編譯期間確定大小的變量,但全局/靜態(tài)存儲(chǔ)區(qū)適用于整個(gè)程序運(yùn)行期間可見的變量,而常量存儲(chǔ)區(qū)用于存放不可修改的常量。