程序的段、堆與棧
1.程序就是編譯出來的鏡像,處於執行狀態的程序叫進程.一個程序可以執行多次,每次執行會產生一個進程.
2.
程序鏡像裏有分成很多個段:
段其實就是在程序鏡像文件裏從一個位置到另一個位置範圍裏存放某種數據,便於系統在加載程序生成進程時的處理.
我們最需要註意的段:.text .rodata .data .bss
具體查看一個程序鏡像裏的段的內容可以通過反匯編查看:
objdump -D a.out
3.
.text段用於統一存放整個程序的代碼指令
.rodata段用於統一存放整個程序的只讀的數據內容.只讀數據段裏的內容只能讀,如作寫操作則會發生段錯誤.
存放只讀的全局變量的值,字符串常量的值, 靜態的只讀的局部變量的值
.data段用於存放初始化過的全局變量的值,初始化過的靜態局部變量值.註意初始化值為零時,不算是初始化過的.
.bss段用於存放未初始化的全局變量以及未初始化的靜態局部變量
.rodata段與.data段在編譯時,編譯器就會在程序鏡像中分配出把需的空間,.rodata段和.data段的內容越多,程序的鏡像就會越大
bss段在編譯時不會分配具體所需的空間,系統加載程序生成進程時才會具體分配空間的。、
4.進程只有一個棧.一個函數執行時,從棧裏分配局部變量的空間,函數執行結束時會回收棧裏分配的空間。回收的空間會重用的。棧空間上限不能超過8M,否則會段錯誤,
堆(heap):系統裏用於動態分配空間的區域,分配出來的空間地址是從低往高分配的。
系統裏只有一個堆。每個進程在堆裏使用的空間是沒有限制大小,只要系統還有可用內存即可申請成功。
動態分配出來的空間需要調用釋放函數回收。
C: malloc() --- free()
C++: new --- delete
程序的段、堆與棧