C++将内存分为四大区域,分别为:代码区、全局区、堆区和栈区。
一、代码区
代码区主要存放机器指令,也就是最终生成的二进制文件。
二、全局区
全局区主要用于存储:常量(字符串常量与全局常量,不包含局部常量)、全局变量与静态变量(包括静态全局变量与静态局部变量)。
我们可以通过打印出各种变量的地址,观察各个地址之间是否相近,来验证其存储位置(受b站黑马程序课程启发)。以下是一个便于理解的简单例子:
#include <iostream>
#include <string>
using namespace std;
int global_v1 = 1; //全部变量1
double global_v2 = 3.14159; //全局变量2
static int global_v3 = 1; //静态全局变量1
static double global_v4 = 3.14159; //静态全局变量1
const int global_v7 = 1; //全局常量1
const double global_v8 = 3.14159; //全局常量2
int main() {
cout << "global_v1's address is [" << &global_v1 << "]" << endl;
cout << "global_v2's address is [" << &global_v2 << "]" << endl;
cout << "global_v3's address is [" << &global_v3 << "]" << endl;
cout << "global_v4's address is [" << &global_v4 << "]" << endl;
static int global_v5 = 1; //静态局部变量1
static double global_v6 = 3.14159; //静态局部变量2
cout << "global_v5's address is [" << &global_v5 << "]" << endl;
cout << "global_v6's address is [" << &global_v6 << "]" << endl;
cout << "global_v7's address is [" << &global_v7 << "]" << endl;
cout << "global_v8's address is [" << &global_v8 << "]" << endl;
/*Hello World是一个字符串常量*/
cout << "Hello world's address is [" << &"Hello World" << "]" << endl;
const int global_v9 = 1; //局部常量1
const double global_v10 = 3.14159; //局部常量2
cout << "global_v9's address is [" << &global_v9 << "]" << endl;
cout << "global_v10's address is [" << &global_v10 << "]" << endl;
return 0;
}
输出结果如下图所示:

从图中我么可以看到,只有v9和v10作为局部常量的地址与其余不同。
三、堆
这里的空间由程序开发人员编写来进行主动申请和释放,当然如果程序没有编写释放,等程序运行结束时,操作系统也会自动释放这块空间。
这样做可以节约内存空间,我们在程序中可以及时释放掉不必要的空间,以减少内存开销。
四、栈
局部变量与局部常量的存储空间在栈区域。在局部变量结束自身生命周期后,这里的空间会被释放。
当然,这里的释放其实本质上,内存空间并不会凭空消失,只是将访问的栈顶指针进行移动,相应的这块区域也就变成了还未申请使用的状态。
本文详细介绍了C++程序中的内存区域划分,包括代码区存放机器指令,全局区存储常量和全局/静态变量,堆区由程序员管理动态内存,而栈区则用于存放局部变量。通过示例展示了如何通过地址验证这些区域的特性。
789

被折叠的 条评论
为什么被折叠?



