C++面向物件基礎--記憶體分割槽模型
阿新 • • 發佈:2020-07-19
C++程式在執行時,將記憶體大方向劃分為4個區域:
程式碼區:存放函式體的二進位制程式碼,由作業系統進行管理的
全域性區:存放全域性變數和靜態變數以及常量
棧區:由編譯器自動分配釋放, 存放函式的引數值,區域性變數等
堆區:由程式設計師分配和釋放,若程式設計師不釋放,程式結束時由作業系統回收
記憶體四區意義:不同區域存放的資料,賦予不同的生命週期, 給我們更大的靈活程式設計空間
1.程式執行前
在程式編譯後,生成了exe可執行程式,未執行該程式前分為兩個區域
程式碼區:
(1)存放 CPU 執行的機器指令
(2)程式碼區是共享的,共享的目的是對於頻繁被執行的程式,只需要在記憶體中有一份程式碼即可
(3)程式碼區是只讀 的,使其只讀的原因是防止程式意外地修改了它的指令
全域性區:
(1)全域性變數和靜態變數存放在此.
(2)全域性區還包含了常量區, 字串常量和其他常量也存放在此.
(3)該區域的資料在程式結束後由作業系統釋放
程式碼示例:
1 #include<iostream> 2 using namespace std; 3 //全域性變數 4 int g_a = 10; 5 int g_b = 10; 6 7 //全域性常量 8 const int c_g_a = 10; 9 const int c_g_b = 10; 10 11 int main() 12 { 13 //區域性變數14 int a = 10; 15 int b = 10; 16 17 //列印地址 18 cout << "區域性變數a地址為: " << (int)&a << endl; 19 cout << "區域性變數b地址為: " << (int)&b << endl; 20 21 cout << "全域性變數g_a地址為: " << (int)&g_a << endl; 22 cout << "全域性變數g_b地址為:" << (int)&g_b << endl; 23 24 //靜態變數 25 static int s_a = 10; 26 static int s_b = 10; 27 28 cout << "靜態變數s_a地址為: " << (int)&s_a << endl; 29 cout << "靜態變數s_b地址為: " << (int)&s_b << endl; 30 31 cout << "字串常量地址為: " << (int)&"hello world" << endl; 32 cout << "字串常量地址為: " << (int)&"hello world1" << endl; 33 34 cout << "全域性常量c_g_a地址為: " << (int)&c_g_a << endl; 35 cout << "全域性常量c_g_b地址為: " << (int)&c_g_b << endl; 36 37 const int c_l_a = 10; 38 const int c_l_b = 10; 39 cout << "區域性常量c_l_a地址為: " << (int)&c_l_a << endl; 40 cout << "區域性常量c_l_b地址為: " << (int)&c_l_b << endl; 41 42 system("pause"); 43 44 return 0; 45 }
執行結果:
總結:
C++中在程式執行前分為全域性區和程式碼區
程式碼區特點是共享和只讀
全域性區中存放全域性變數、靜態變數、常量
常量區中存放 const修飾的全域性常量 和 字串常量
2.程式執行後
棧區:
由編譯器自動分配釋放, 存放函式的引數值,區域性變數等
注意事項:不要返回區域性變數的地址,棧區開闢的資料由編譯器自動釋放
程式碼示例:
1 #include<iostream> 2 using namespace std; 3 int * func() 4 { 5 int a = 10; 6 return &a; 7 } 8 9 int main() 10 { 11 12 int *p = func(); 13 14 cout << *p << endl; 15 cout << *p << endl; 16 17 system("pause"); 18 19 return 0; 20 }
堆區:
由程式設計師分配釋放,若程式設計師不釋放,程式結束時由作業系統回收
在C++中主要利用new在堆區開闢記憶體
程式碼示例:
1 #include<iostream> 2 using namespace std; 3 int* func() 4 { 5 int* a = new int(10); 6 return a; 7 } 8 9 int main() 10 { 11 12 int *p = func(); 13 14 cout << *p << endl; 15 cout << *p << endl; 16 17 system("pause"); 18 19 return 0; 20 }
總結:
堆區資料由程式設計師管理開闢和釋放
堆區資料利用new關鍵字進行開闢記憶體(C語言中用malloc()函式,在C++中儘量不要使用)