C++内存分区

本文详细介绍了C++程序中的内存区域划分,包括代码区存放机器指令,全局区存储常量和全局/静态变量,堆区由程序员管理动态内存,而栈区则用于存放局部变量。通过示例展示了如何通过地址验证这些区域的特性。

        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作为局部常量的地址与其余不同。

三、堆

        这里的空间由程序开发人员编写来进行主动申请和释放,当然如果程序没有编写释放,等程序运行结束时,操作系统也会自动释放这块空间。

        这样做可以节约内存空间,我们在程序中可以及时释放掉不必要的空间,以减少内存开销。

四、栈

        局部变量局部常量的存储空间在区域。在局部变量结束自身生命周期后,这里的空间会被释放。

当然,这里的释放其实本质上,内存空间并不会凭空消失,只是将访问的栈顶指针进行移动,相应的这块区域也就变成了还未申请使用的状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值