C 記憶體分配

2021-06-19 22:26:07 字數 863 閱讀 9139

在c++中記憶體分配方式大體可以分為3種:靜態儲存區分配,棧分配,堆分配

首先我們來看看這些分配有什麼特點:對於靜態儲存區分配來說,它分配的變數在程式執行的整個時期都存在,一般static宣告的變數和全域性變數都在靜態儲存區,靜態儲存區變數的內存在函式編譯的時候就已經分配好了。而對於棧,可以說在函式中的普通變數都是存在於棧中,當然new或者malloc的物件是存在於堆中的。棧中的變數當然有乙個特點,那麼就是記憶體是由系統自動分配,用完後就立即釋放。而對於堆來說,裡面的變數是由程式設計師自己分配,自己釋放的,因此這裡容易出現記憶體洩露。

棧:在windows下,棧是向低位址擴充套件的資料結構,是一塊連續的記憶體的區域。這句話的意思是棧頂的位址和棧的最大容量是系統預先規定好的,在windows下,棧的大小是2m(也有的說是1m,總之是乙個編譯時就確定的常數),如果申請的空間超過棧的剩餘空間時,將提示overflow。因此,能從棧獲得的空間較小。 

堆:堆是向高位址擴充套件的資料結構,是不連續的記憶體區域。這是由於系統是用鍊錶來儲存的空閒記憶體位址的,自然是不連續的,而鍊錶的遍歷方向是由低位址向高位址。堆的大小受限於計算機系統中有效的虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大。 

棧由系統自動分配,速度較快。但程式設計師是無法控制的。堆是由new分配的記憶體,一般速度比較慢,而且容易產生記憶體碎片,不過用起來最方便。

char s1 = "aaaaaaaaaaaaaaa"; 

char *s2 = "bbbbbbbbbbbbbbbbb"; 

aaaaaaaaaaa是在執行時刻賦值的; 而bbbbbbbbbbb是在編譯時就確定的; 但是,在以後的訪問中,在棧上的陣列比指標所指向的字串(例如堆)快。 

C 記憶體分配

總結 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是...

C 記憶體分配

c 中的記憶體主要分為五塊 全域性區 static 存放全域性變數或靜態變數 常量區 const 存放常量,不允許修改 可以通過特殊手段修改 堆 heap 由使用者自行分配和釋放,在程式執行時分配。由malloc分配,由free釋放 自由儲存區 free store 由new分配,由delete釋放...

C 記憶體分配

在c 中,記憶體分成4個區,他們分別是堆,棧,靜態儲存區和常量儲存區 1 棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變數的儲存區.裡面的變數通常是區域性變數,函式引數等.2 堆,又叫自由儲存區,它是在程式執行的過程中動態分配的,它最大的特性就是動.態性.由new分配的記憶體塊,他...