C++底层内存机制——栈和堆详细解析

因为很多同学对内存的使用是很困惑的,不知道什么是栈空间什么是堆空间,也不知道变量在内存里的具体分配是什么样子的,这个文章主要是来解释两种内存的区别的——栈上是从上到下按照顺序来的,堆是随机的根据内存大小来进行的(这一部分的底层实现和原理要涉及计算机组成原理和汇编语言,实在不等可以等以后就知道了)
这里写的是C++代码,和C没有太大的区别,应该是可以看懂的
在这里插入图片描述

对于一个程序的启动,操作系统将全部的内容加载到内存中,同时还要再分配一些内存来保证我们可以进行程序的运行

栈的大小一般是预定义的,而且和平台是有关系的,通常是2MB。堆的大小也是有预定义的,但是会随着应用程序的运行进行增长和变化。因为栈里面的东西往往都是进行被访问的,所以栈里面很多的数据会被继续存在缓存中

在我们进行空间的申请的时候,栈和堆的申请逻辑是不一样的,栈是根据顺序来进行申请的,因此我们才不需要用指针来进行指向,但是堆是去空余空间的表里面进行空间的查找,找到了就进行分配
请添加图片描述

这里的两个变量之间本来不应该有空的为初始化内容的,是因为debug模式为了安全会这样填充来进行保护,一旦是release模式下就不会这样了

后面的这个对象v也是在栈里面进行创建的,紧紧跟在array后面

因为在栈中进行分配其实就是栈顶指针的移动,移动的数目是按照类型来的,因此是连续的

堆的new是进行malloc函数的调用的,是根据空闲列表去查的可以进行内存分配的空间的(但是底层还是调用的操作系统的API),因此往往都不是连续的内存。空闲列表标记的是那些内存块是没有使用的。

在堆上分配内存是很复杂的,因为其涉及到操作系统的系统调用,因此开销很大,但是在栈上面进行分配的消耗是很小的,可以说几乎没有

请添加图片描述

而且因为栈里面的变量是连续的,所以一般都是在同一个缓存行的,因此速度是很快的,但是在堆里面隔得很远因此可能出现大量的缓存未命中从而导致IO等巨大开销

在这里插入图片描述

在这里插入图片描述

上面的两张图就可以看到,new会进行函数调用然后去遍历空闲列表,但是栈上变量其实就是一行mov指令,mov对应的就是栈上创建变量,调用函数的第二张图对应的就是堆上创建空间(malloc函数是new关键字的底层实现的)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值