記憶體分配(堆、棧、BSS、程式碼段、資料段)
這兩天看了馬士兵老師的視訊、視訊中提到了一個萬能鑰匙、就是了解程式執行中對記憶體的操作、主要講了堆、棧、Data、說真的有點暈、看了兩遍、也就略懂一二、在這做個小小知道總結
簡介
我們程式執行的時候都是放在記憶體裡的、根據靜態、成員函式、程式碼段、物件、等等、放在不同的記憶體分塊裡、大概分為5塊
1 棧
2 堆
3 BSS段-全域性區-(靜態區)
4 程式碼段
5 資料段
棧
存放區域性變數、臨時變數、宣告、返回值、指向堆物件的地址(指標)、總之存放一些小的東西、當不需要時候、棧會自動清除、比如一個加法方法裡面、聲明瞭兩個int並賦值、這兩個就是放在棧裡面、類裡面的
堆
存放new出來的物件、棧裡面所有物件都是在堆裡面有指向的、假如棧裡指向堆的指標被刪除、堆裡的物件也要釋放(C++需要手動釋放)、當然我們現在好面向物件程式都有'垃圾回收機制'、會定期的把堆裡沒用的物件清除出去。
程式碼段
存放程式執行程式碼的一塊記憶體區域、裡面是二進位制的程式碼、記憶體區域通常屬於只讀, 某些架構也允許程式碼段為可寫,其實就是存放程式碼框架、或者說函式體、程式碼體的地方。
BSS段-全域性區-(靜態區)
上邊是三個名字- -、找到的、差不多就那個意思、這個BSS段、就是存放為初始化的全域性變數與未初始化的靜態變數。
資料段
BSS段的是未初始化的、這個就像接他的班、資料段存放已初始化的全域性變數和靜態變數。
Data
BSS+資料段、包含這兩個區段的叫資料區……其實我也不是很懂、大概就是BSS+資料段就叫Data區、就像 火燒+肉=火燒夾肉……
思維導圖
例子程式
這是一個前輩寫的,非常詳細
<span style="font-size:18px;">//main.cpp int a = 0; // 資料段 char *p1; // BSS段 main() { int b; // 棧 char s[] = "abc";// 棧 char *p2;// 棧 char *p3 = "123456"; // 123456\0在常量區,p3在棧上。 static int c =0; // BSS段 Class c1 = new Class();//new出的物件就在堆區 strcpy(p1, "123456"); //123456\0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。 } </span>
總結:
馬士兵說這是萬能鑰匙、我還看到不太懂、以前只知道堆和棧、後來又勾引出來這麼多、還是比較有收穫的、本來不想總結、因為感覺知道的很少、後來想了想、就因為知道的少才要總結、要不怎麼能知道的更多呢?
———————————大家來找茬、找到文章錯誤的地方、請到我這領取…………————————————
———————————chenchen———————————
參考文章