一、c/c++記憶體分配的5個區分別是:
棧區、堆區、全域性區(靜態區)、文字常量區、程式**區
1、棧區:編輯器自動分配 和 釋放,存放函式的引數,區域性變數等。
2、堆區:一般是程式設計師分配和釋放,如果在程式一直執行的狀態下,程式設計師不去釋放記憶體,會導致記憶體洩漏之後會打到一定程度的時候會導致系統崩潰。 或者如果程式設計師沒有釋放記憶體但程序結束時,記憶體的**是由os來**的
3、全域性區(靜態區):全域性變數和靜態變數 在不初始化的情況下預設的是0,存放在一塊區域。 如果是初始化的話是存放在相鄰的另一塊區域。 程式結束時是由系統來釋放記憶體的。
4、文字常量區:所有的字串都存放在文字常量區。 當程式結束時由系統釋放。
5、程式**區:程式設計師寫的所有**都是存放在**區的。
二、堆和棧的區別
記憶體的管理方式:
棧:是由編輯器自動管理,宣告變數時分配空間,變數結束使用時釋放空間。
堆:是由程式設計師負責分配和釋放的, 對於c用malloc來分配記憶體,用free釋放記憶體。 對於c++用new來分配記憶體,用delete釋放記憶體。 但對於堆容易造成記憶體洩漏
空間的大小不同:
棧:在windows下,棧是向低位址擴充套件擴充套件的資料結構,是一塊連續的記憶體區域。就是說棧頂的位址事先規定好,一般情況下windows下棧的大小是2m。當申請的空間超過棧的剩餘空間時,將提示overflow。
堆:堆是向高位址擴充套件的資料結構,是不連續的記憶體區域。系統是用鍊錶儲存空閒的記憶體位址。堆的大小受限與計算機系統中有效的虛擬記憶體,因此堆獲得的空間比較靈活,也是比較大的。
記憶體的分配方式:
堆:堆是由程式設計師分配和釋放記憶體的。但往往很多程式設計師都是分配記憶體之後忘了釋放記憶體。 所以這樣很容易導致記憶體洩漏
分配速率:
棧:棧是機器系統提供的資料結構,計算機會在底層對棧提供支援:分配專門的暫存器存放棧的位址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高。
堆:堆為了分配一塊記憶體,庫函式會按照某種演算法在堆記憶體尋找可用的足夠大小的空間,如果沒有足夠大小的空間,就有可能呼叫系統功能去增加程式資料段的記憶體空間,這樣就會分到足夠大小的記憶體,然後進行返回。這種分配方式的效率比較慢。
三、程式例子
#include #include int a; // 預設初始化為0,全域性未初始化區
int b = 3; // 全域性初始化區
int c = 4; // 全域性初始化區
int main()
c 記憶體分配詳解
c語言可執行 結構 名稱內容 段可執行 字串常量 資料段已初始化全域性變數 已初始化全域性靜態變數 區域性靜態變數 常量資料 bss段 未初始化全域性變數,未初始化全域性靜態變數 棧區域性變數 函式引數 堆動態記憶體分配 一般情況下,乙個可執行二進位制程式 更確切的說,在linux作業系統下為乙個程...
C 中記憶體分配詳解
程式執行時,特別要注意的是記憶體的分配。下面介紹c 程式設計中的記憶體分配。一 記憶體基本構成 可程式設計內存在基本上分為這樣的幾大部分 靜態儲存區 堆區和棧區。他們的功能不同,對他們使用方式也就不同。靜態儲存區 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資...
C 程式記憶體分配詳解
1.硬碟中的結構 程式 首先在linux下檢視一下test檔案的資訊 root localhost ctest file test 此檔案基本情況 test elf 32 bit lsb executable,intel 80386,version 1 sysv for gnu linux 2.2....