1)在linux下內存分配是以頁爲單位的,而頁是經過段管理html
2)一個linux進程的虛擬地址空間分佈如上圖所示,分爲用戶空間和內核空間,對於一個32位操做系統來講,4GB的空間分紅兩部分,低地址的0~3G給用戶空間,高地址的3G~4G給內核空間linux
1)存放只讀數據:字符串常量(如"hello")和const修飾的全局變量c++
2)不是全部的只讀數據都是放在只讀數據段,有些能夠經過當即數(在當即尋址方式指令中給出的數稱爲當即數;當即尋址方式:操做數緊跟在操做碼的後面,與操做碼一塊兒放在指令代碼中)來實現的常量(如「int i=5」中的「5」)不存放在只讀數據段,而是直接編碼在指令裏,存放在在正文段程序員
3)const修飾的全局變量是存放在常量段的,可是使用const修飾的局部變量不存放在常量段,存放在棧段數據結構
4)對於字符串常量,編譯器會在常量段中自動去重,讓每種字符串常量只有一份函數
5)爲了提升空間的利用率,有些系統中.rodata段是多個進程共享的編碼
6)程序加載運行時,.rodata和.text一般合併到一個段(Text Segment)中,操做系統將這個段只讀保護起來,防止意外的改寫操作系統
,也叫正文段,存放代碼htm
2)初始化數據段(.data):存放已經初始化的
3)未初始化數據段(.bss):存放未初始化的
4).data和.bss在程序加載時合併到一個段(Data Segment)中,這個段是可讀可寫的
5)c++不區分初始化的和未初始化的,它們佔同一塊區域
動態內存的分配
1)常被用來加載共享庫(動態庫)
2)內存映射:將虛擬內存空間與磁盤上的文件關聯起來,這個過程叫內存映射
存放局部變量
1)管理方式:對於棧來說,是由編譯器自動管理,無需咱們手工控制;對於堆來講,釋放工做由程序員控制,容易產生內存泄露
2)空間大小:通常來說在32位系統下,堆內存能夠達到3G的空間(4G有1G要給內核);而棧的最大容量是事先規定好的(例如,在VC6下面,默認的棧空間大小是1M,可修改)
3)碎片問題:對於堆來說,頻繁的new/delete勢必會形成內存空間的不連續,從而形成大量的碎片,使程序效率下降;對於棧來說,則不會存在碎片,由於棧是先進後出的結構,一個內存塊要從棧中彈出,在它上面的後進的內存塊確定要先被彈出
4)生長方向:對於堆來說,生長方向是向上的,也就是向着內存地址增長的方向;對於棧來說,它的生長方向是向下的,是向着內存地址減少的方向增加;
5)分配方式:堆都是動態分配的;而棧有2種分配方式:靜態分配和動態分配,靜態分配是編譯器完成的,好比局部變量的分配,動態分配由alloca函數(相似於malloc,專門在棧中申請空間的函數)進行分配,可是即便是動態分配,它也和堆是不一樣,棧的動態分配是由編譯器進行釋放,無需咱們手工釋放
6)分配效率:棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率比較高;堆則是C/C++函數庫提供的,它的機制是很複雜,例如:爲了分配一塊內存,庫函數會在堆內存中搜索連續的足夠大小的空間,若是沒有足夠大的空間(多是因爲內存碎片太多),就須要操做系統從新整理內存空間,這樣就有機會分到足夠大的內存,而後進行返回。顯然,堆的效率比棧要低得多
存放內核的代碼和數據,全部進程的內核代碼段都映射到一樣的物理內存,並在內存中持續存在