1. 程式人生 > >軟件開發--深入理解程序的結構

軟件開發--深入理解程序的結構

產生 由於 和數 內存 小結 需要 內存管理 mark 沒有

程序由不同的段構成(代碼段,數據段)
1.程序的靜態特征就是指令和數據
2.程序的動態特征就是執行指令處理數據

A.段
傳統上,一個程序一般會有這幾個段:.text 、.data、.bss段
a.如果處理器由內存管理單元,那麽可執行程序被加載到內存以後,通常會將.text段所在的內存空間設置為只讀,以保護.text中的代碼不會因為程序出錯而被意外改寫
b.處理器所需加工的數據是放在.data、.bss、.rdata段

代碼示例
1.情況一
技術分享圖片技術分享圖片技術分享圖片
運行的結果圖進行對比,可以看到的是.data和.bss段的大小有了變化,這是因為在第二個實驗中增加了兩個變量。對於初始化不為0 的變量,編譯器會將它放入.data段中,而對於初始化為0的變化量會被放入.bss段中

技術分享圖片

二.棧
棧的作用:
1.當中斷發生時用於保存處理器寄存器的值,以便中斷返回時通過退棧回到被中斷點繼續程序的運行
2.用作函數參數和局部變量的存儲空間。正因為棧還可以用於存放局部變量,所以棧指針的變化並不只是通過退棧才可以改變
3.函數調用時,棧用於保存函數的活動記錄(棧幀信息),並發編程時,每一個線程擁有獨立的棧
SP寄存器作為棧頂"指針"實現入棧操作和出棧操作
技術分享圖片
三.程序中的堆
1.堆是一片"閑置"的內存空間,用於提供動態內存分配
2.堆空間的分配需要函數支持
3.堆空間在使用結束後需要歸還

四.小結
1.程序中的內容是通過段進行分類管理的。在傳統的三個段中,.text段用於存放處理器指令,.data段用於存放初始化的全局和靜態變量,.bss段則用於存放初始化為0和未初始化的全局和靜態變量。一個程序不管有多少個段,各段都屬於程序,數據和調試信息三大類的一種。

2.棧為函數參數和局部變量提供存儲空間。局部變量所占用的內存空間是由編譯器生成的指令自動分配與釋放的,因此不存在像堆那樣的內存泄漏問題。在多任務環境中,由於各任務的函數調用路徑可以不同,所以每一個任務都有屬於自己的棧空間
3.堆中的內存在沒有分配出來之前,是整個系統所共享的。要從堆中獲取內存,必須通過函數調用來實現。如果從堆中所分配獲得的內存不在需要使用了,則必須調用相應的函數進行釋放,否則會產生內存泄漏

軟件開發--深入理解程序的結構