C++内存布局

C++内存布局中,堆和栈在内存中的关系是怎样的,堆相对栈总是处于低地址区吗?windows linux上布局一样吗?

环境说明

win10 64位, vc6, vs2019, centos7.9 gcc9.3 linux, mint20.2 gcc9.3

遇到问题先搜索一番

基本上都是一样的图示,随便找了两个放在下面。
网上1

网上2

看到这里似乎脑袋里灵光一闪,内存布局一定是这样的:
  1. 堆相对于栈总是处于低地址区,
  2. 堆上高地址增长
  3. 栈向低地址增长。

实际表现是这样吗

由于平时使用windows,先在windows上验证一下吧。

  • 经典的VC6
    VC6

啥情况?怎么栈的地址好像比堆的要小呢?一定是VC6这老古董太老了,有bug。

  • VS2019 x86 在新版本上总应该没问题了吧
    VS2019_x86

奇怪了,依旧与网上大神们的图对不上,栈的地址就是比堆要小

  • VS2019 x64 哦,我知道了,现在是64位的天下,谁还看x86的呀,再换x64试试
    VS2019_x64

这下总算与网上大神们的图对上了,可是堆和栈的增长方向好像与大神们不一样

  • centos7.9,忽然想到大神们是不是 都不用windows,再看看linux吧

linux64内存分布

完美匹配,看来大神们一定是用的centos linux开发学习的

  • linuxmint 20.2(基于ubuntu) linux debian系 redhat系都挺多的,再试试debian系(手头只有虚拟机版本的,凑和用吧)

mint

啥?又与大神们的图对不上了?已经开始晕了

思考一下

win上x86 与x64 不同,linux 同为x64 centos 与 linuxmint(ubuntu) 不同。为什么呢?

其实这是由于内存是由操作系统管理的,具体到内存布局上不同系统会有不同的分配方式,堆和栈及其它代码段数据段等的相对关系不是全部统一的,需要我们区别对待

总结

相信通过这个学习过程,读者已经对内存布局有了更深的理解,再来回顾一下
网上1
这个图展示了一种典型的内存布局,读者千万不可认为所有系统上均是如此

那么对我们之前内存布局的理解应修改为

  1. 堆相对于栈不总是处于低地址区,
  2. 不总是向高地址增长
  3. 不总是向低地址增长。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nwao7890

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值