13 C++内存模型

1.C++程序执行时,将内存分位4个区

代码区:存放函数体的二进制代码,有操作系统进行管理;

全局区:存放全局变量和静态变量以及常量;

堆    区:由程序员分配和释放,弱程序员不释放,程序结束时有操作系统回收;

栈    区:由编译器自动分配和释放,存放函数的参数值,局部变量

不同区域存放的数据,赋予不同的生命周期。

2 程序执行前的内存模型

在程序编译后,生成*.exe可执行程序,未执行该程序前分位两个区域。

2.1代码区

存放 CPU 执行的机器指令。通常代码区是可共享的(即另外的执行程序可以调用它),使其可共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可。代码区通常是只读的,使其只读的原因是防止程序意外地修改了它的指令。另外,代码区还规划了局部变量的相关信息。

总结:你所写的所有代码放到代码区中,代码区的特点是共享和只读。

2.2 全局区:

存放全局变量和静态变量。

全局区中:主要存放的数据有全局变量、静态变量、常量(如字符串常量)

全局区的叫法有很多:全局区、静态区、数据区、全局静态区、静态全局区

这部分可以细分为data区和bss区:

data区:主要存放已经初始化的全局变量,静态变量和常量。

bss区:主要存放未初始化的全局变量和静态变量,这些未被初始化的变量会自动的倍系统初始化为0或NULL。

3 程序执行前的内存模型

程序运行后产生两个区域,栈区和堆区

3.1 栈区(stack)

栈是一种先进后出的内存结构,由编译器自动分配释放,存放函数的参数值,返回值,局部变量。在存续运行过程中实时加载和释放,因此,局部变量的生产周期为申请到释放该段栈空间。

#include<iostream>
int func()
{
	//局部变量 栈区
	int x = 8;
	int y = 9;
	std::cout << "局部变量x地址:" << &x << std::endl;
	std::cout << "局部变量y地址:" << &y << std::endl;
	//const 修饰的局部变量 栈区
	const int c_x = 7;
	const int c_y = 8;
	std::cout << "局部变量c_x地址:" << &c_x << std::endl;
	std::cout << "局部变量c_y地址:" << &c_y << std::endl;
	return x;
}
int main()
{
	int a=func();
	std::cout << "局部变量a地址:" << &a << std::endl;
	return 0;
}

 3.2 堆区(heap)

堆是一个大容器,它的容量要远远大于栈,但没有栈那样先进后出的顺序。用于动态内存分配。堆在内存中位于BSS区和栈区之间。一般有程序员分配和释放。若程序员不释放,程序结束时由操作系统回收。

#include<iostream>

void func2()
{
	int *arr = new int[10]();
	std::cout << "堆区arr地址:" << &arr << std::endl;
	delete[]arr; arr = nullptr;
}
int main()
{
	func2();
	return 0;
}

程序运行后如下图所示:

 

 当我们把几个案例放在一起执行,就可以看到内存将每个区域划分的很有条理。每个区域互不干涉,区域中的数据地址也是非常接近的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值