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.

顺序 选择 循环 总结

posted @ 2021-08-11 12:48  kaizenly  阅读(3808)  评论(0编辑  收藏  举报
打赏