根據用於分配記憶體的方法,c++提供了3種管理資料記憶體的方式:自動儲存、靜態儲存和動態儲存(也稱自由儲存空間或堆)。在存在時間的長短方面,以這3種方式分配的資料物件各不相同。
1、自動儲存
在函式內部定義的常規變數使用自動儲存空間,被稱為自動變數,這意味著它們在所屬的函式被呼叫時自動產生,在該函式結束時消亡。
實際上,自動變數是乙個區域性變數,其作用域為包含它的**塊。**塊是被包含在花括號中的一段**。到目前為止,我們使用的所有**塊都是整個函式。如for迴圈函式、if條件判斷函式(特別注意:if( ; ; ),容易忽略)。函式內也可以有**塊,如果在其中的某個**塊定義乙個變數,則該變數僅在程式執行該**塊中的**時存在。
自動變數通常儲存在棧中。這意味著執行**塊時,其中的變數將依次加入到棧中,而在離開**塊時,將按相反的順序釋放這些變數,這被稱為後進先出。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。
2、靜態儲存
靜態儲存是整個程式執行期間都存在的儲存方式。使變數稱為靜態的方式有兩種:一種是在函式外面定義它;另一種是在宣告變數時使用關鍵字static。
自動儲存和靜態儲存的關鍵在於:這些方法嚴格限制了變數的壽命。
3、動態儲存
new和delete運算子提供了一種比自動變數和靜態變數更靈活的方法。它們管理乙個記憶體池,這在c++中被稱自由儲存空間或堆。該記憶體池同用於靜態變數和自動變數的記憶體是分開的。
例項說明:
例1:
#include
void main()
j++;
printf("%d\t",j);
printf("%d\t",i);
}printf("%d\n",j);
while(1);
}
該程式在vs2010下的執行結果如下圖所示:
注:為何這裡要強調是在vs2010下的執行結果,那是因為在不同的軟體下執行結果可能不同,這與其編譯器種類有關。若在vc6.0下編譯,則結果就不同。
說明:
1.外部for迴圈中的 i, j 與內部for迴圈中的 i, j是不一樣的,它們占有不同的記憶體,而且都是在for函式內部定義的常規變數,故都為自動變數。特別要注意的是,i和j即使同為乙個for迴圈下定義的自動變數,但它們的生命週期並不相同,有細微的差別:for下的小括號()中定義的自動變數,它是在整個for函式執行完之後才釋放記憶體,而for下的大括號中定義的自動變數,是在每次for迴圈後就釋放記憶體。對比兩個for迴圈函式中的 i、j 變數的變化可得此結論(在vs2010下逐步執行該程式,觀察區域性變數的變化)。這也是在for迴圈中(指大括號中)重複定義變數,編譯器不報錯的原因所在。
2.同樣,main()函式中的 j也是自動變數,與for函式中定義的 j不同,它們占有不同的記憶體。
例2:
#include
void main()
else
printf("%d\t",j);
}printf("%d\t",j);
while(1);
}
該程式在vs2010下的執行結果如下圖所示:
說明:仔細分析可知,if函式中的變數j為區域性變數,只在if函式內有效,當在if函式外時其記憶體被釋放。與例1中的for函式同理。這裡,特別容易忽略if是乙個函式,通常我們只認為它僅是一條語句,其實不然,注意其內部定義的變數為自動變數。
記憶體管理 記憶體管理概述
儲存器的發展方向是高速 大容量和小體積,即儲存器嘗試更高讀寫速度,更大儲存容量,更小物理體積。在計算機中,常見的儲存器有 暫存器,快取,記憶體,硬碟,一般硬碟之類的輔助儲存器又稱外存。在平均讀寫速度上,有 暫存器 快取 記憶體 外存 在單位容量 上,有 外存 記憶體 快取 暫存器 cpu處理器只能直...
《記憶體管理》 記憶體
1.c c 記憶體分布 我們先來看下面的一段 和相關問題 int globalvar 1 static int staticglobalvar 1 void test char char2 abcd char pchar3 abcd int ptr1 int malloc sizeof int 4 ...
linux kernel記憶體管理資料結構
是乙個全域性變數,指向乙個struct page陣列,管理著系統中的所有物理頁面,陣列中的每個page結構,對應乙個物理頁框.mem map僅當系統為單node時有效,對於arm平台,只有乙個node with no discontig,the global mem map is just set ...