linux系統下,程式是乙個可執行檔案,通常是elf格式。通常,
linux的可執行檔案擁有兩種記憶體分配方式:
儲存時和
執行時1、儲存時
看例項,下
面是對可執行檔案aa
執行size命令後得到的結果。
[root@***1 algriom]# size aa
text data bss dec hex filename
1257 500 16 1773 6ed aa
其中:text(**區):表示正文段大小,是cpu執行的機器指令部分,通常,是可共享的,所以即使是頻繁執行的程式在儲存器中也只需有乙個副本;
data(初始化資料區):表示包含已經初始化(可執行檔案包含了初始化的值)的靜態變數和全域性變數
的資料段大小;
bss :表示未初始化的全域性變數和未初始化的靜態變數,稱之為未初始化資料段;
ps:第4列和第5列是分別以十進位制和十六進製制表示的三個段的總長度。
2、執行時(程序結構)
執行時是指乙個正在執行的程序在記憶體空間中的結構,也就是乙個程序的結構。
一般包括**區、全域性儲存區(初始化資料區data、未初始化資料區bbs)、文字常量區、堆和棧5個部分。
(1)**區:存放函式體的二進位制**
(2)全域性(靜態)儲存區:存放全域性變數、靜態變數;
data:存放初始化的全域性變數和靜態變數static
bbs:存放未初始化的全域性變數和靜態變數static,bbs段中,記憶體中所有位元組預設值都是0;
【c中static作用】:1、隱藏;2、預設初始化為0,只能賦一次初值;3、保持區域性變數內容持久
(3)文字常量區(唯讀區):常量字串;const
修飾的全域性變數儲存在文字段中,
const
修飾的區域性變數儲存在棧中。
但是,陣列只存放於棧、全域性儲存區
(4)棧區:儲存函式引數值、返回值、區域性變數等。向下生長。
(5)堆區:用於動態記憶體分配。向上生長。函式結束變數就消失。可以跨函式使用,直到free時才釋放
int main()
答案:6,4
分析:p指標儲存在棧,而其儲存的hello!存在文字常量區;
a 陣列存放在棧,此時的hello不僅僅存放在文字常量區,還拷貝乙份存放在棧中,因為a是乙個存放在棧上的陣列。
堆區和棧區的區別如下:
(1)棧由作業系統自動管理,無需程式設計師手工控制,而堆區的申請和釋放工作由程式設計師控制。一般由malloc(或new)函式來分配記憶體塊,並且需要用free(delete)函式釋放記憶體。如果程式設計師沒有釋放掉,那麼就會出現常說的
記憶體洩漏
問題。需要注意的是,兩個緊挨著定義的指標變數,所指向的malloc出來的兩塊記憶體並不一定的是緊挨著的,所以會產生記憶體碎片。
棧
是使用者存放程式臨時建立的區域性變數,也就是說我們
函式括弧「{}」中定義的變數
(但不包括static宣告的變數,static意味著在資料段中存放變數)。除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,函式的返回值也會被存放回棧中。由於棧的先進先出特點,所以棧特別方便用來儲存/恢復呼叫現場。從這個意義上講,我們可以把堆疊看成乙個寄存、交換臨時資料的記憶體區。
(2)棧是一塊連續的記憶體區域,由系統預先設定,一般較小,從高位址向低位址增長;而堆是向高位址擴充套件的資料結構,是不連續的記憶體區域,空間較大。另外,分配的效率上,棧的分配比堆的分配要高效很多。
注意: 1、
初始化的全域性變數和靜態變數儲存在data中。2、
未經初始化的全域性變數和靜態變數儲存在
bss中。3
、函式內部宣告的區域性變數
儲存在棧中。4、
const
修飾的全域性變數儲存在文字段中,
const
修飾的區域性變數儲存在棧中。5、
字串常量儲存在文字段中。
3、例子程式
int a = 0; 全域性初始化區
char *p1; 全域性未初始化區
main()
linux 程式儲存結構
inux系統下,程式是乙個可執行檔案,通常是elf格式。通常,linux的可執行檔案擁有兩種記憶體分配方式 儲存時 和 執行時 1 儲存時 看例項,下面是對可執行檔案aa執行size命令後得到的結果。root 1 algriom size aa text data bss dec hex filen...
Linux程式儲存結構
在linux系統下,程式是乙個普通可執行檔案,以下列出乙個linux下elf格式可執行檔案的基本情況 可以看出,此elf格式可執行檔案在儲存時 沒有調入記憶體 分為 區 text 資料區 data 和未初始化資料區 bss 3個部分。各段基本內容說明如下 區 text segment 存放cpu執行...
Linux檔案儲存結構
大部分的linux檔案系統 如ext2 ext3 規定,乙個檔案由目錄項 inode和資料塊組成 理解inode,要從檔案儲存說起。檔案儲存在硬碟上,硬碟的最小儲存單位叫做 扇區 sector 每個扇區儲存512位元組 相當於0.5kb 作業系統讀取硬碟的時候,不會乙個扇區乙個扇區地讀取,這樣效率太...