1. 程式人生 > 實用技巧 >C++面向物件基礎--記憶體分割槽模型

C++面向物件基礎--記憶體分割槽模型

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++中儘量不要使用)