c 記憶體布局

2021-09-27 13:55:21 字數 878 閱讀 3117

寫好了**只是第一步,接下來還需要編譯生成對應的二進位制才能使用(預處理,編譯,彙編,鏈結)。

那麼在執行的時候,**和資料在記憶體中都是怎麼分布的呢?c的記憶體布局是怎樣的呢?c++的記憶體布局是怎樣的呢?

有一點值得注意,c語言和c++的記憶體布局是不一樣的,這也就是平日裡搜尋c++記憶體布局的文章內容總是很相似但還不相同的原因,有些人沒有對比清楚兩者區別!我以前也是這樣的。

c語言記憶體布局分為5部分:初始化資料段,未初始化資料段,**段、堆區和棧區

未初始化資料段儲存未被初始化的變數,也稱之為bss段,即block started by symbol。未被初始化的變數被預設初始化為0,包括全域性變數和被static修飾的靜態變數

**段儲存**編譯出來的二進位制,程式執行的時候由依次執行

堆區儲存程式中動態申請出來的空間(malloc出來的,注意free釋放記憶體,否則會出現記憶體洩漏問題)

棧區儲存程式中的區域性變數。堆與棧的生長方向相反:棧在記憶體中也是一種資料結構中棧的樣子,是向位址小的方向生長,在linux中可以檢視棧的大小`ulimit -s`;堆在記憶體中的結構如同資料結構中的堆,向著方向大的地方生長,堆比較大,比較接近計算機記憶體的大小。

c++的記憶體布局同樣分為5個部分:

靜態變數的問題

靜態變數只在當前檔案中生效,其他檔案中是看不見的。如果想要在檔案中看到另乙個檔案中的變數,需要使用extern關鍵字進行修飾,表示該變數已經在其他檔案中宣告了,此處只是宣告一下區通過編譯,在link階段會找到定義的位置進行鏈結。

靜態區域性變數和靜態變數,通過static修飾的變數會擴大變數的生命週期,在程式執行的階段一直存在;而區域性變數是儲存在棧上的,當當前函式(block)退出後,裡面的區域性變數就會被退棧釋放掉

new和malloc的區別

堆和棧的區別

C 記憶體布局

注意,上述只描述的是可執行檔案具有三個段,而不是由該三個段構成。在 linux 下,我們可以通過size命令輸出可執行檔案的段資訊。記憶體布局 存放程式指令和字串常量 我們知道,可執行檔案的文字段包含程式的指令,鏈結器把指令直接從可執行檔案拷貝到記憶體中,形成文字段。存放已初始化的全域性變數和sta...

C語言記憶體布局

重點關注以下內容 c語言程式在記憶體中各個段的組成 c語言程式連線過程中的特性和常見錯誤 c語言程式的執行方式 一 c語言程式的儲存區域 由c語言 文字檔案 形成可執行程式 二進位制檔案 需要經過編譯 彙編 連線三個階段。編譯過程把c語言文字檔案生成匯程式設計序,彙編過程把匯程式設計序形成二進位制機...

C 物件記憶體布局

好文要記下來 上 下 玄機逸士系列 補充一點,兩個博文裡面都沒有給出虛基類表中的第一項的解釋,其實第一項就是vbptr到自己類物件位址的偏移量。若沒有虛函式,也就是沒有vfptr,偏移量為0,若有,就為 4 vfptr 在 vbptr之前,所以是 4 玄機逸士的結論 vc 6 其一,只要涉及到虛基類...