C++程序內存布局:
代碼區(code area) | 程序內存空間 |
全局數據區(data area) | |
堆區(heap area) | |
棧區(stack area) |
一個由C/C++編譯的程序占用的內存分為以下幾個部分,
1)
全局區(靜態區)(static)存放全局變量、靜態數據,const常量。程序結束后有系統釋放
2)
棧區(stack) 函數運行時分配,函數結束時釋放。由編譯器自動分配釋放 ,存放為運行函數而分配的局部變量、函數參數、返回數據、返回地址等。其操作方式類似於數據結構中的棧。
3)
堆區(heap) 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS(操作系統)回收。分配方式類似於鏈表。
4)文字
常量區 常量字符串就是放在這里的。 程序結束后由系統釋放。
5)程序
代碼區存放函數體(類成員函數和全局函數)的二進制代碼。

棧區和堆區的區別:
1)申請方式: 棧區內存由系統
自動分配,函數結束時釋放;堆區內存由
程序員自己申請,並指明大小,用戶忘釋放時,會造成內存泄露,不過進程結束時會由系統回收。
2)申請后系統的響應: 只要棧的剩余空間大於所申請的空間,系統將為程序提供內存,否則將報異常提示
棧溢出;堆區,
空閑鏈表,分配與回收機制,會產生碎片問題(外部碎片)-->(固定分區存在內部碎片(分配大於實際),可變分區存在外部碎片(太碎無法分配))。
3)申請大小的限制:棧是1或者2M,可以自己改,但是最大不超過8M;堆,看主機是多少位的,如果是32位,就是4G
4)申請效率:棧由系統自動分配,速度較快,程序員無法控制;堆是由new分配的內存,一般速度較慢,而且容易導致內存碎片,但是用起來方便!
5)存儲內容:棧,函數調用(返回值,各個參數,局部變量(
靜態變量不入棧));堆,一般在堆的頭部用一個字節存放堆的大小,堆中的具體內容由程序員安排。
6)存取效率的比較:棧比堆快,Eg :char c[] = /"1234567890/";char *p =/"1234567890/";讀取c[1]和p[1],c[1]讀取時直接吧字符串中的元素讀到寄存器cl中,而p[1]先把指針值讀到edx中,再根據edx讀取字符,多一次操作。
7)管理方式不同:棧,數據結構中的棧;堆,鏈表
8)生長方向:棧,高到低;堆,低到高