標籤:std value 實現 tac targe static stat 執行 資料類型
前言:最近正在學習有關static的知識,發覺對C++的記憶體分區不是很瞭解,上網查了很多資料,遂將這幾天的學習筆記進行了簡單整理,發表在這裡
? 棧區(stack):主要用來存放函數的參數以及局部變數。棧區由系統進行記憶體管理,在函數完成執行時,系統會自行釋放棧區的記憶體,而不需要使用者參與管理。整個程式的棧區的大小可以在編譯器中由使用者自行設定,預設的棧區大小為3M
? 堆區(heap):由使用者手動申請,手動釋放。如果使用者忘記對其所申請的記憶體資源進行釋放,該記憶體資源可能會在程式結束時由作業系統(OS)進行釋放(也可能不會)
[注意]:
1.C++系統記憶體分區中的堆和資料結構中的堆是不同的,但C++記憶體分區中的堆對系統資源的分配方式和資料結構中的鏈表卻十分相似
2.在C中使用者通常用malloc進行記憶體的申請,用free進行記憶體的釋放;而在C++中使用者通常用new進行記憶體的申請,用delete進行記憶體的釋放(C++同樣支援malloc/free方式)。
3.通常認為C++中有兩個動態記憶體地區。通過new/delete方式進行記憶體資源的分配和釋放的稱為自由儲存區(free store),而通過malloc/free方式進行記憶體資源的分配和釋放的稱為堆區(heap)。但本質上來說很多編譯器中的new操作符是通過malloc進行記憶體申請的,因此可以將堆區理解為自由儲存區的一個具體實現,雖然二者不完全相同,但很多時候可以混為一談。 (如果想細究堆區和自由儲存區的不同,可以參考這個部落格:http://www.cnblogs.com/QG-whz/p/5060894.html)
4.new與malloc的幾點不同:
? malloc是C語言中的函數,而new是C++中的操作符
? malloc申請之後返回的類型是void*,而new返回的指標則是帶有特定資料類型的
? malloc只負責記憶體的分配而不會調用類的建構函式,而new不僅會分配記憶體,而且會自動調用類的建構函式
? 靜態區(全域區)(static):用來存放程式的全域變數和靜態變數。在C語言中,初始化的全域變數和靜態變數放在一塊記憶體地區中,而未初始化的全域變數和靜態變數放在與之相鄰的另一塊記憶體地區中。而在C++中則沒有在靜態區中將初始化的和未初始化的變數進行分開儲存,因為C++會對未初始化的全域變數和靜態變數進行預設初始化(一般預設初始化為0)。該地區儲存的資料會在程式結束後由系統來釋放。
[注意]:
全域變數和靜態全域變數在C++中的儲存方式是一樣的,但不同的是全域變數在整個原始碼中都是可以使用的,而靜態全域變數只能在當前檔案中使用。比如一個程式有3個檔案a.cpp、b.cpp和c.cpp,如果在檔案a.cpp中定義了一個全域變數x,那麼該變數x在檔案a.cpp、b.cpp和c.cpp中都可以使用;但如果在檔案a.cpp中定義了一個靜態全域變數y,那麼該變數y只能在檔案a.cpp中使用檔案b.cpp和檔案c.cpp都不可以使用該靜態全域變數y
? 常量儲存區:用來儲存程式中的常量,比如const常量,字串常量等都儲存在這個地區。該地區儲存的資料會在程式結束後由系統來釋放
[注意]:
1.在程式運行期間,該地區中儲存的常量是全域可見的。
2.當我們定義char *ptr="Tomwenxing"時,字串“Tomwenixng”就儲存在這個地區
? 代碼區:存放程式體的二進位代碼。比如我們在程式中自訂的函數,其函數體就是以二進位代碼的形式儲存在這個地區的
? 執行個體:
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 int value1=10; //全域變數:儲存在靜態區(全域區) 5 const int value2=10; //const常量:儲存在常量區 6 static int value3=10; //static變數:儲存在靜態區 (全域區) 7 8 //函數func:儲存在代碼區 9 void func(int a){ //a為函數參數:儲存在棧區 10 int temp=10; //局部變數:儲存在棧區11 static int temp2; //靜態變數(預設初始化為0):儲存在靜態區(全域區) 12 cout<<"This is func"<<endl; // "This is func"是字面值常量:儲存在常量區 13 }14 15 //函數main:儲存在代碼區 16 int main(){17 int value4=10; //局部變數;儲存在棧區18 char *ptr1=NULL; //局部變數:儲存在棧區19 static int value5=10; //靜態變數:儲存在靜態區(全域區)20 char *ptr2="Tomwenxing"; //ptr2為局部變數:儲存在棧區; "Tomwenxing"為字面值常量:儲存在常量區21 ptr1=(char*)malloc(sizeof(char)*100); // malloc動態開闢的空間:儲存在堆區22 strcpy(ptr1,"Hello"); //"Hello"是字面值常量:儲存在常量區 23 free(ptr1);24 int *ptr3=new int; //ptr3為局部變數:儲存在棧區;new動態開闢的空間:儲存在堆區(自由儲存區) 25 delete ptr3;26 return 0; 27 }
C++:記憶體分區