內存分配的形式有哪些

一個c/c++編譯的程序所佔用的系統內存一般分爲以下幾個部分的內容:

(1)  由符號起始的區塊(BlockStartedBySymbol BSS)段:

BSS段通常是指用來存放程序中未初始化的全局數據和靜態數據的一塊內存區域。

(2) 數據段(data segment):數據段通常是指用來存放程序中已經初始化的全局變量的一塊內存區域,數據段也屬於靜態內存分配

(3) 代碼段:用來存放程序的執行代碼(包括類成員函數和全局函數以及其他函數代碼)的一塊內存區域,這部分區域的大小在程序運行前就已經確定,並且內存區域通常只讀,某些架構也允許代碼段爲可寫,即允許修改程序。在代碼段中,也有可能包含一些只讀的常數變量,如字符串常量,這個片段一般是可以被共享的,如在 Linux系統中打開兩個 Vi來編輯文本,那麼一般來說這兩個 Vi是共享一個代碼段的。

(4) 堆(heap): 堆用於存放進程運行中被動態分配的內存段,它的大小並不是固定的,可以動態的擴張或縮減。當進程調用 malloc 或 new 等函數分配內存時, 新分配的內存就被動態的添加到堆上,利用freedelete等函數釋放內存時,被釋放的內存從堆中被刪除(堆被縮減)。堆一般由程序員分配釋放,若程序員不釋放,程序結束時可能由操作系統回收。需要注意的是,他與數據結構中的堆是兩回事,分配方式類似於鏈表。

(5) (stack): 棧用於存放程序臨時創建的局部變量,但不包括static申明的變量,static意味着數據段中存放的變量)。除此之外,在函數被調用時,其參數也會被壓入發起調用的進程棧中,並且等到調用結束後,函數的返回值也會被存放回棧中。棧由編譯器自動分配釋放,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。棧內存分配運算內置於處理器的指令集中,一般使用寄存器來存儲,效率很高,但是分配的內存容量有限

注意:

代碼段和數據段之間有明確的分隔,但是數據段和堆棧段之間沒有,而且棧是向下增長的,堆是向上增長的。

int global = 0//全局初始化區 數據段

char* p1; // 全局未初始化區 BBS由符號起始的區塊段

int main() {

int a; // 棧

char s[] = "abcdefg" //

char *p2; // 棧

char* p3 = "123456789" // 123456789在常量區代碼段 , p3在棧上

static int c = 0; // 全局初始化區

p1 = (char*) malloc(100); // 

p2 = (char*) malloe(200); // 分配得來的100 和 200 字節的區域就在堆區

strcpy(p1, "123456789"); // 12345678放在常量區,編譯器可能會將它與 p3

//所指向的“123456789”優化成一個地方

return 0;

}

除了全局靜態對象,還有局部靜態對象和類的靜態成員,局部靜態對象是在函數中定義的,就像棧對象一樣,就像棧對象一樣,只不過,前面多了個static關鍵字。

局部靜態對象的生命期是從其所在函數第一次被調用,更確切的說,是當第一次執行到該靜態對象對的申明代碼時,產生該靜態局部對象,直到整個過程結束時,才銷燬該對象,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章