Linux系統下,程序是一個可執行文件,通常是ELF格式。通常,Linux的可執行文件擁有兩種內存分配方式:存儲時 和 運行時
1、存儲時
看實例,下面是對可執行文件aa運行size命令後得到的結果。
[root@xxx1 algriom]# size aa
text data bss dec hex filename
1257 500 16 1773 6ed aa
其中:
text(代碼區):表示正文段大小,是CPU執行的機器指令部分,通常,是可共享的,所以即使是頻繁執行的程序在存儲器中也只需有一個副本;
data(初始化數據區):表示包含靜態變量和已經初始化(可執行文件包含了初始化的值)的全局變量的數據段大小;
bss :表示未初始化的全局變量和未初始化的靜態變量,稱之為未初始化數據段;
PS:第4列和第5列是分別以十進制和十六進制表示的三個段的總長度。
2、運行時(進程結構)
運行時是指一個正在運行的進程在內存空間中的結構,也就是一個進程的結構。
一般包括代碼區、初始化數據區、未初始化數據區、堆區和棧區5個部分。
前三者與存儲時相同,(1)棧區存儲函數參數值、返回值、局部變量等。向下生長
(2)堆區用於動態內存分配。向上生長
堆區和棧區的區別如下:
(1)棧由操作系統自動管理,無需程序員手工控制,而堆區的申請和釋放工作由程序員控制。
(2)棧是一塊連續的內存區域,由系統預先設定,一般較小,從高地址向低地址增長;而堆是向高地址擴展的數據結構,是不連續的內存區域,空間較大。另外,分配的效率上,棧的分配比堆的分配要高效很多。
結論:
1、 經過初始化的全局變量和靜態變量保存在數據段中。
2、 未經初始化的全局變量和靜態變量保存在BSS段。
3、 函數內部聲明的局部變量保存在堆棧段中。
4、 const修飾的全局變量保存在文本段中,const修飾的局部變量保存在堆棧段中。
5、 字符串常量保存在文本段中。