C/C++代碼的內存分佈

1. C代碼的內存分佈

一個程序本質上都是由 BSS 段、data段、text段三個組成的。C代碼在運行裝入內存時會增加棧和堆。
C代碼的內存分佈:

說明
由編譯器在需要時分配,在不需要時自動清除,通常是局部變量、函數參數等
由程序員自己申請(malloc)和釋放(delete)的內存,如果沒有釋放,程序結束後,可能由操作系統釋放
數據段 初始化的全局變量和靜態變量,靜態內存分配
BSS段 未初始化的全局變量,靜態內存分配
代碼段 存放的是程序代碼,也可能存放一些只讀的常量,如字符串常量等

/*全局變量,項目中的所有文件都可以使用這個變量,但外部文件使用前要加extern聲明*/
int a = 1;

/*靜態全局變量,具有文件作用域,即該變量只能在當前文件的任意位置使用*/
static int b;

void func(){
	/*局部變量,是在函數體內定義的變量(包括main,各函數同名的局部變量並無影響),
	只在函數執行期間存在,在函數調用結束之後變量會被撤銷,其所佔的空間也會被釋放。*/
	int c=1;

	/*靜態局部變量,只被初始化一次,直到程序結束之前都會一直存在。但是隻能被定義自
	己的函數一直可見*/
	static int d=2;
}

此外,對於全局變量和static修飾的靜態變量,如果不賦初值,編譯時自動爲該變量賦值爲0。

2. C++內存分佈

基本上和C是差不多的,但有些變化

說明
由編譯器在需要時分配,在不需要時自動清除,通常是局部變量、函數參數等
由程序員自己申請(malloc)和釋放(free)的內存,如果沒有釋放,程序結束後,可能由操作系統釋放
全局/靜態存儲區 初始化的和未初始化的全局變量和靜態變量都在這一塊,C是分開的,C++將其放在同一塊
自由存儲區 程序員使用操作符new(delete)申請(釋放)的內存
常量存儲區 存放的是隻讀的常量

說明:
new操作符從自由存儲區(free store)上爲對象動態分配內存空間,而malloc函數從堆上動態分配內存。自由存儲區是C++基於new操作符的一個抽象概念,凡是通過new操作符進行內存申請,該內存即爲自由存儲區。而堆是操作系統中的術語,是操作系統所維護的一塊特殊內存,用於程序的內存動態分配,C語言使用malloc從堆上分配內存,使用free釋放已分配的對應內存。
那麼自由存儲區是否能夠是堆(問題等價於new是否能在堆上動態分配內存),這取決於operator new 的實現細節。自由存儲區不僅可以是堆,還可以是靜態存儲區,這都看operator new在哪裏爲對象分配內存。

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