linux下程序的記憶體分布:
核心空間
棧(棧的下面有預留空間,棧記憶體方向向低位址延伸)
動態鏈結對映區
堆(堆的上方有預留空間,堆記憶體方向向高位址延伸)
讀寫部分
唯讀部分
預留空間
棧
例項:
棧頂:
0xbfffffff
0xbffffffb
0xbffffff8
0xbffffff4
esp暫存器標明棧頂
棧上壓入資料會導致esp減小
彈出資料會導致esp增大
棧儲存了乙個函式呼叫所需要的維護資訊
(1)函式的返回位址和引數
(2)臨時變數:包括函式的非靜態區域性變數以及編譯器自動生成的其他臨時變數
(3)儲存的上下文:包括在函式呼叫前後保持不變的暫存器
int foo(int n,float m)
實際棧狀態
m//先壓入,位址大
n 返回位址
函式返回值傳遞:
eax暫存器是傳遞返回值的通道(只有四個位元組),大於四個位元組則採用eax和edx聯合返回的方式進行
堆
malloc申請的空間如果是指虛擬空間,那麼是連續的,如果是指物理課龍劍,那麼不一定連續,因為一塊連續的虛擬位址空間有可能是若干個不連續的物理頁拼湊而成的
堆分配演算法:
(1)空閒鍊錶法:將堆中各個空閒的塊按照鍊錶的方式連線起來,當使用者請求一塊空間時,可以遍歷整個鍊錶,直到找到合適大小的塊將它劃分;當使用者釋放空間時,將它合併到空閒鍊錶中
(2)位圖:將整個堆劃分為大量的塊,每個塊的大小相同
(3)物件池:被分配物件的大小是較為固定的幾個值
個人有關記憶體的思考
對於應用程式而言,記憶體中儲存區域大致有堆 棧 靜態區域三個部分。系統在分配記憶體的時候,會在記憶體中尋找乙個能夠滿足申請大小的區域進行標記,並返回此區域的大小。在應用程式執行時,系統為應用程式分配的只是虛擬的位址空間,並不是實際的物理儲存器。這就需要給程序預定的區域 位址空間 調撥物理儲存器 記憶...
有關記憶體對齊的問題
1 某個成員距離首位置的偏移量最小是該成員大小的一倍。2 所有成員的大小之和應該是最大成員大小的整數倍。為什麼要記憶體對齊?點這裡 來段 解釋下 我們接下來就來解釋為什麼stu1和stu2分別是8和12,主要還是我們的兩個規則 注意 下面的表示方法,例如short b 就會在兩個位元組中填b,表示占...
有關記憶體的思考題
摘自 高質量c c 程式設計指南 四 有關記憶體的思考題 20 分 void getmemory char p p char malloc 100 void test void char str null getmemory str strcpy str,hello world printf str...