C++—程式的記憶體分割槽
-
程式碼區
程式被作業系統載入到記憶體時,所有可執行的程式碼被載入到程式碼區,也叫程式碼段,儲存程式的程式碼指令。程式執行時,這段區域資料不可被修改只可以被執行。
-
靜態區
程式中的靜態變數、全域性變數存放在此區域(初始化的全域性變數和靜態變數在一塊區域)。程式碼執行期間一直佔用記憶體!
-
堆
堆是不連續的記憶體區域,獲得的空間比較靈活,也比較大,一般速度比較慢,而且容易產生記憶體碎片,不過用起來最方便。需要程式設計師申請的記憶體空間,空間的釋放一般由程式設計師控制(比如new, delete, malloc, free)。當程式設計師沒有釋放該記憶體空間的時候,程式執行完畢時作業系統會對該記憶體空間進行回收。
-
棧
棧是一塊連續的記憶體的區域,一般棧的大小都是預先設定好的,如果申請的空間超過棧的剩餘空間時,將提示overflow。存放的通常是變數通常是區域性變數、函式引數等。
-
文字常量區
常量字串就是放在這裡的。 程式結束後由系統釋放。
-
bss段
定義而沒有賦初值的全域性變數和靜態變數,放在這個區域,通常只是記錄變數名和大小,相當於一個佔位符。
一個程式本質上都是由 .bss
段、 .data
段、 .text
段三個組成的。 .data
段包含三個部分:heap(堆)、stack(棧)和靜態資料區。 .text
段存放程式碼區。 .bss
裡面裝載了未被初始化的資料;如圖:
示例如下:
int a = 0; //全域性初始化區(靜態區) char *p1;//全域性未初始化區 (BSS段) int main() { int b; //棧 char s[] = "abc"; //棧 char *p2; //棧 char *p3 = "123456"; //123456/0在常量區,p3在棧上。 static int c = 0; //全域性(靜態)初始化區 (靜態區) p1 = (char *)malloc(10); //分配得10和20位元組的區域就在堆區。 p2 = (char *)malloc(20); strcpy(p1, "123456"); //123456/0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一塊。 return 0; }
可以聯合之前所寫的關於連結的一些總結,引用那張圖如下:
