1. 程式人生 > >記憶體分配(堆、棧、BSS、程式碼段、資料段)

記憶體分配(堆、棧、BSS、程式碼段、資料段)

這兩天看了馬士兵老師的視訊、視訊中提到了一個萬能鑰匙、就是了解程式執行中對記憶體的操作、主要講了堆、棧、Data、說真的有點暈、看了兩遍、也就略懂一二、在這做個小小知道總結

簡介

         我們程式執行的時候都是放在記憶體裡的、根據靜態、成員函式、程式碼段、物件、等等、放在不同的記憶體分塊裡、大概分為5塊

1  棧

2  堆

3 BSS段-全域性區-(靜態區)

4 程式碼段 

         5 資料段

存放區域性變數、臨時變數、宣告、返回值、指向堆物件的地址(指標)、總之存放一些小的東西、當不需要時候、棧會自動清除、比如一個加法方法裡面、聲明瞭兩個int並賦值、這兩個就是放在棧裡面、類裡面的

8個基本變數常量型別、宣告賦值以後都會在棧裡、其他的放在堆裡。注:(byte、short、int、long、char、float、double、boolean)(聽說跟資料結構的棧很像、但是我學資料結構的時候其實就想到了這個棧)

存放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———————————

參考文章