幾個常見的資料存儲區
轉載并修改自:
https://blog.csdn.net/a1299600490/article/details/77119939棧,就是那些由編譯器在需要的時候配置設定,在不需要的時候自動清除的變量的存儲區。裡面的變量通常是局部變量、函數參數等。在一個程序中,位于使用者虛拟位址空間頂部的是使用者棧,編譯器用它來實作函數的調用。棧區大小固定,一般為1M,位址向下擴充。(由于這一特性,柔性數組(即初始化時隻指定首位址,不指定長度的數組,初始化方式為:int a[],int a[0],int a[]={};int b[0][5], int b[][5]={},int b[][5]等,詳見
https://www.cnblogs.com/veis/p/7073076.html)無法在main函數内定義,同樣,大的動态數組也最好不要在main函數内定義)
typedef struct _SoftArray{
int len;
int array[];//柔性數組定義為結構體變量,合法
}SoftArray;
int test_static[];//柔性數組定義為全局變量,合法
int main()
{
int test_main[];//柔性數組定義為動态變量,非法
}
堆,指由malloc配置設定,free釋放,或者由new配置設定,delete釋放的記憶體區域,這片區域他們的釋放編譯器不去管,由我們的應用程式去控制,一般一個 new 就要對應一個 delete。如果程式員沒有釋放掉,那麼在程式結束後,作業系統會自動回收。堆可以動态地擴充和收縮,這個區域通常較大,并向高位址擴充。此種說法的假設是new/delete就是由malloc/free實作。
另有一種說法:由malloc配置設定,free釋放的存儲在堆區,由new配置設定,delete釋放的存儲在自由存儲區,自由存儲區一般來講不僅包括堆區,還可能包括全局存儲區的未配置設定部分。
全局/靜态存儲區,全局變量和靜态變量被配置設定到同一塊記憶體中,在以前的 C 語言中,全局變量又分為初始化的和未初始化的(初始化的全局變量和靜态變量在一塊區域,未初始化的全局變量與靜态變量在相鄰的另一塊區域,同時未被初始化的對象存儲區可以通過 void* 來通路和操縱,程式結束後由系統自行釋放),在 C++ 裡面沒有這個區分了,他們共同占用同一塊記憶體區。
常量存儲區,這是一塊比較特殊的存儲區,他們裡面存放的是常量,不允許修改(當然,你要通過非正當手段也可以修改,而且方法很多),常量存儲區屬于代碼段。代碼段屬于應用層的劃分,劃分圖如下:
BSS段,通常是指用來存放程式中未初始化的全局變量的一塊記憶體區域。BSS是英文Block Started by Symbol的簡稱。一般在初始化時bss 段部分将會清零。bss段屬于靜态記憶體配置設定,即程式一開始就将其清零了。
資料段,資料段(data segment)通常是指用來存放程式中已初始化的全局變量的一塊記憶體區域。資料段屬于靜态記憶體配置設定。
代碼段,代碼段(code segment/text segment)通常是指用來存放程式執行代碼的一塊記憶體區域。這部分區域的大小在程式運作前就已經确定,并且記憶體區域通常屬于隻讀, 某些架構也允許代碼段為可寫,即允許修改程式。在代碼段中,也有可能包含一些隻讀的常數變量,例如字元串常量等。代碼段是存放了程式代碼的資料,假如機器中有數個程序運作相同的一個程式,那麼它們就可以使用同一個代碼段。
原文位址
https://blog.csdn.net/u014391177/article/details/82227875