C++內存分區


【1】內存分區模型

各種說法,但都有一定道理,只是划分角度或邏輯不同。

1、三部分

C++程序在執行時,將供用戶使用內存大致划分為三個區域:

(1)程序存儲區:存放函數體的二進制代碼,由操作系統進行管理;

(2)靜態存儲區:靜態存儲區數據在程序開始就已經分配好了內存,執行過程中,它們所占的存儲單元是固定的,在程序結束時就釋放,所以該區數據一般為全局變量。

(3)動態存儲區:動態存儲區數據是在程序的執行過程中根據需要動態分配和動態釋放的存儲單元。

2、四部分

C++程序在執行時,將供用戶使用內存大致划分為四個區域:

(1)代碼區:存放函數體的二進制代碼,由操作系統進行管理;

(2)全局區:存放全局變量和靜態(全局、局部)變量和字符串常量;

(3)棧區(stack):由編譯器自動分配釋放, 存放函數的參數值,局部變量等;

(4)堆區(heap):由程序員分配和釋放,若程序員不釋放,程序結束時由操作系統回收。

3、五部分

C++程序在執行時,將供用戶使用內存大致划分為五個區域:

(1)程序代碼區:存放函數體(類的成員函數、全局函數)的二進制代碼;

(2)全局/靜態區(static):全局變量和靜態變量的存儲是放在一起的,在程序編譯時分配;

(3)文字常量區:存放常量字符串。

(4)棧區(stack):由編譯器自動分配釋放,存放函數的參數值,局部變量值等,其操作方法類似數據結構中的棧。

(5)堆區(heap):一般由程序員分配釋放,與數據結構中的堆毫無關系,分配方式類似於鏈表。

綜上所述,個人建議,按四個區域理解即可。

【2】內存分區意義

不同區域存放不同的數據,賦予數據不同的生命周期, 更大限度的靈活編程。

【3】內存分區示例

示例代碼:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 //全局變量
 5 int g_a = 10;
 6 int g_b = 10;
 7 
 8 //全局常量
 9 const int c_g_a = 10;
10 const int c_g_b = 10;
11 
12 //全局靜態
13 static int s_g_a = 11;
14 static int s_g_b = 11;
15 
16 int main() 
17 {
18     //局部變量
19     int a = 10;
20     int b = 10;
21 
22     //打印地址
23     cout << "局部變量a地址為: " << (int)&a << endl;
24     cout << "局部變量b地址為: " << (int)&b << endl << endl;
25 
26     cout << "全局變量g_a地址為: " << (int)&g_a << endl;
27     cout << "全局變量g_b地址為: " << (int)&g_b << endl << endl;
28 
29     //靜態變量
30     static int s_l_a = 10;
31     static int s_l_b = 10;
32 
33     cout << "局部靜態變量s_l_a地址為: " << (int)&s_l_a << endl;
34     cout << "局部靜態變量s_l_b地址為: " << (int)&s_l_b << endl << endl;
35 
36     cout << "全局靜態變量s_g_a地址為: " << (int)&s_g_a << endl;
37     cout << "全局靜態變量s_g_b地址為: " << (int)&s_g_b << endl << endl;
38 
39     cout << "字符串常量地址為: " << (int)&"hello world" << endl;
40     cout << "字符串常量地址為: " << (int)&"hello world1" << endl << endl;
41 
42     cout << "全局常量c_g_a地址為: " << (int)&c_g_a << endl;
43     cout << "全局常量c_g_b地址為: " << (int)&c_g_b << endl << endl;
44 
45     const int c_l_a = 10;
46     const int c_l_b = 10;
47     cout << "局部常量c_l_a地址為: " << (int)&c_l_a << endl;
48     cout << "局部常量c_l_b地址為: " << (int)&c_l_b << endl << endl;
49 
50     int* p_l_a = new int(100);
51     int* p_l_b = new int(100);
52     cout << "堆地址p_l_a為: " << (int)p_l_a << endl;
53     cout << "堆地址p_l_b為: " << (int)p_l_b << endl << endl;
54 
55     cout << "局部指針變量p_l_a地址為: " << (int)&p_l_a << endl;
56     cout << "局部指針變量p_l_b地址為: " << (int)&p_l_b << endl << endl;
57 
58     system("pause");
59 
60     return 0;
61 }
62 
63 /*
64 局部變量a地址為: 193985460
65 局部變量b地址為: 193985492
66 
67 全局變量g_a地址為: 541388800
68 全局變量g_b地址為: 541388804
69 
70 局部靜態變量s_l_a地址為: 541388816
71 局部靜態變量s_l_b地址為: 541388820
72 
73 全局靜態變量s_g_a地址為: 541388808
74 全局靜態變量s_g_b地址為: 541388812
75 
76 字符串常量地址為: 541376352
77 字符串常量地址為: 541376368
78 
79 全局常量c_g_a地址為: 541375408
80 全局常量c_g_b地址為: 541375412
81 
82 局部常量c_l_a地址為: 193985524
83 局部常量c_l_b地址為: 193985556
84 
85 堆地址p_l_a為: 1848809664
86 堆地址p_l_b為: 1848791904
87 
88 局部指針變量p_l_a地址為: 193985592
89 局部指針變量p_l_b地址為: 193985624
90 */

示例分析圖:

【4】Windows內存布局

 

good good study, day day up.

順序 選擇 循環 總結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM