乙個程序在記憶體中會佔5個區域:
1.程式**區
存放程式**
2.常量區
一般定義字串時,內容存放在常量區
如: char *tmp="hello" //hello存放在常量區
3.全域性(靜態)儲存區
全域性變數,靜態(static)變數存放在全域性儲存區,裡面的資料會一直儲存到被新的資料覆蓋或者程序退出。
程式**區、常量區和全域性(靜態)儲存區,這三部分的記憶體分配,在編譯時就已經完成。
4.棧區域性變數、函式引數、函式入口位址等存放在棧中。主要是存放臨時資料、變數的有效性會隨著程式的執行而改變,如退出函式會,函式中的 區域性變數會被踢出棧中。linux預設棧大小為8m,window為2m。
5.堆用malloc申請的內存在堆裡,堆的可用大小相對不受限制,有效週期為主動呼叫free函式或者程序結束。
其中,堆和棧的生長方式是不一樣的。
堆的生長方式是自低位址向高位址,棧的生長方式是自高位址向低位址。
堆與棧的討論:
管理方式:
堆中資源由程式設計師控制(容易產生memory leak)。
棧資源由編譯器自動管理,無需手工控制。
系統響應:
堆,系統有乙個記錄空閒記憶體位址的鍊錶,當系統收到程式申請時,遍歷該鍊錶,尋找第乙個空間大於申請空間的堆結點,刪除空閒結點鍊錶中的該結點,並將該結點空間分配給程式(大多數系統會在這塊記憶體空間首位址記錄本次分配的大小,這樣delete才能正確釋放本記憶體空間,另外系統會將多餘的部分重新放入空閒鍊錶中)。
棧,只要棧的剩餘空間大於所申請空間,系統為程式提供記憶體,否則報異常提示棧溢位。
空間大小:
堆:不連續的記憶體區域(因為系統是用鍊錶來儲存空閒記憶體位址,自然不是連續的),堆大小受限於計算機系統中有效的虛擬記憶體(32bit系統理論上是4g),所以堆的空間比較靈活,比較大。
棧是一塊連續的記憶體區域,大小是作業系統預定好的,windows下棧大小是2m(也有是1m,在編譯時確定,vc中可設定)。
碎片問題:
對於堆,頻繁的new/delete會造成大量碎片,使程式效率降低。
對於棧,它是乙個先進後出的佇列,進出一一對應,不會產生碎片。
堆向上,向高位址方向增長。
棧向下,向低位址方向增長。
分配方式:
堆都是動態分配(沒有靜態分配的堆)。
棧有靜態分配和動態分配,靜態分配由編譯器完成(如區域性變數分配),動態分配由alloca函式分配,但棧的動態分配的資源由編譯器進行釋放,無需程式設計師實現。
分配效率:
堆由c/c++函式庫提供,機制很複雜。所以堆的效率比棧低很多。
棧是極其系統提供的資料結構,計算機在底層對棧提供支援,分配專門暫存器存放棧位址,棧操作有專門指令。
比如class a
int a;
char c;
void pri(int a);
void a::pri(int a)
printf("a=%d\n",a);
int main()
a arr;
printf("sizeof(arr)=%d",sizeof(arr));
printf("sizeof(arr.a)=%d",sizeof(arr.a));
printf("sizeof(arr.c)=%d",sizeof(arr.c));
其中sizeof(arr)=8
sizeof(arr.a)=4
sizeof(arr.c)=1
由於記憶體對齊的原則,及時c占用的空間為1,實際分配了4個位元組。
記憶體對齊基本上是透明的,這是編譯器該幹的活,編譯器為程式中的每個資料單元安排在合適的位置上,從而導致了相同的變數,不同宣告順序的結構體大小的不同。
對齊規則:
每個特定平台刪的編譯器都有自己預設的「對齊係數/對齊模數」,可以通過預編譯命令#pragma pack(n),n=1,2,4,8,16來改變。
規則:1.資料成員對齊規則,結構struct或者union的資料成員,第乙個資料成員放在offset為0的地方,以為每個資料成員的對齊,按照#parama pack指定的值和這個資料成員自身長度中,比較小的那個進行;
2.結構或聯合的整體對齊規則,在資料成員完成對齊後,結構體本身也需要對齊
3.當@parama pack的n值等於或者超過所有資料成員長度的時候,這個n值不產生任何效果
記憶體對齊含義
對於記憶體對齊問題,主要存在於struct和union等復合結構在記憶體中的分布情況,許多實際的計算機系統對基本型別資料在記憶體中存放的位置有限制,它們要求這些資料的首位址的值是某個數m 通常是4或8 對於記憶體對齊,主要是為了提高程式的效能,資料結構,特別是棧,應盡可能在自然邊界上對齊,經過對齊後...
記憶體CL RCD RP RAS含義
cas latency 行位址控制器延遲時間,簡稱cl。表示從已經定址的行,到達輸出快取器的資料所需要的時鐘迴圈數。對記憶體來說,這是最重要的乙個引數,這個值越小,系統讀取記憶體資料的速度就越快,反之越慢。tras 列動態時間,也稱tras,表示乙個記憶體晶元上兩個不同的列逐一定址時所造成的延遲,以...
jvm記憶體分割槽及各區執行緒問題
1.堆 heap 主要存放物件的例項也包括陣列,是垃圾管理的主要作用區,是執行緒共享的 2.棧 stack 虛擬機器棧 描述的是 j a 方法執行的記憶體模型,每個方法在執行的同時會建立乙個 stack frame 方法執行時的基礎資料結構 用於儲存區域性變數表 操 作數棧 動態連線 方法出口等資訊...