C++程序的存儲空間佈局

原文地址:http://ju-kevin.spaces.live.com/blog/cns!907BD90CD611C0C7!217.entry(已不能訪問)

轉載地址:http://blog.sina.com.cn/s/blog_697c18bb0100lnod.html

C++程序的存儲空間佈局

C++程序的存儲空間佈局 作者:JuKevin

C++程序是由一下幾部分組成:

(1) 正文段 (.text)

程序代碼就存儲咋text 段,這是由C P U執行的機器指令部分。通常,正文段是可共享的,所以即使是經常執行的程序(如文本編輯程序、C編譯程序、s h e l l等)在存儲器中也只需有一個副本,另外,正文段常常是隻讀的,以防止程序由於意外事故而修改其自身的指令。

當你在鏈接定位文件中將該符號放置在代碼段後,那麼該符號表示的值就是代碼段大小,編譯連接時,該符號所代表的值會自動代入到源程序中。

(2) 只讀數據段 .rdata

只讀數據是在程序運行期間不能被修改的,程序只能讀取這些數據,因此編譯器把他們組織在一起存儲在只讀數據段。

(3) 初始化數據段data

data端用於存儲經過初始化的數據,包括帶初值的全局變量和static變量,都存儲在data區。data段的起始位置也是由連接定位文件所確定,大小在編譯連接時自動分配,和程序大小沒有關係,但和程序使用到的全局變量,常量數量相關。

(3) 未初始化數據段bss

bss這一名稱來源於早期彙編程序的一個操作符意思是Block Started by Symbol(由符號開始的塊),通常是指用來存放程序中未初始化的全局變量的一塊內存區域,在程序載入時由內核清0。 BSS段屬於靜態內存分配。它的初始值也是由用戶自己定義的連接定位文件所確定,用戶應該將它定義在可讀寫的RAM區內,源程序中使用malloc分配的內存並不是這一塊,它不是根據data大小確定,主要由程序中同時分配內存最大值所確定,不過如果超出了範圍,也就是分配失敗,可以等空間釋放之後再分配。

(4) 棧stack

stack是用來存儲局部變量以及每次函數調用時所需保存的信息。每次函數調用時,其返回地址、以及調用者的環境信息(例如某些機器寄存器)都存放在棧中。然後,新被調用的函數在棧上爲其自動和臨時變量分配存儲空間。通過以這種方式使用棧, C函數可以遞歸調用。stack是一種“後進先出”(Last In First Out,LIFO)的數據結構,這意味着最後放到棧上的數據,將會是第一個從棧上移走的數據。對於哪些暫時存貯的信息,和不需要長時間保存的信息來說,LIFO這種數據結構非常理想。在調用函數或過程後,系統通常會清除棧上保存的局部變量、函數調用信息及其它的信息。棧另外一個重要的特徵是,它的地址空間“向下減少”,即當棧上保存的數據越多,棧的地址就越低。棧(stack)的頂部在可讀寫的RAM區的最後。

(5) 堆heap

編譯器通常在堆中進行動態內存分配

由於歷史上形成的慣例,堆位於非初始化數據段頂和棧底之間。堆是“先進先出”(First In first Out,FIFO)數據結構。它只允許在堆的一端插入數據,在另一端移走數據。堆的地址空間“向上增加”,即當堆上保存的數據越多,堆的地址就越高。

image

數據存儲

(1) 常量

對於整型常量和字符型常量,由於不需要寫操作,編譯器會將其直接編譯在代碼之中,因此不需要存儲。

對於字符串常量,編譯器將其放入只讀數據端.rdata,同事對於相同的字符串常量,編譯器會優化並只存儲一次。

(2) 變量

- 全局變量

未初始化的,存儲於.bss ; 初始化的,存儲於.data

- 靜態變量

和全局變量相同

-自動變量

局部變量存儲於stack ; 動態分配的內存,存儲於heap。

- 寄存器變量

存儲位置在CPU寄存器內。


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