【发布时间】:2020-10-17 14:02:29
【问题描述】:
我正在学习 c++ 并执行此代码
#include<stdio>
using namespace std;
int main(){
char* buffer = new char[5];
printf("%p", &buffer); // 000000000061fe10
cout<<endl;
printf("%p", buffer); // 0000000000796b700
}
给了我 2 个完全分开的内存位置,我的意思是大约 150 万字节,那么为什么堆大小应该是 5 个字节呢? char size * 5. 堆向下增长(从 0xFFF ... 到 0x0000 ..)在堆下有堆栈,所以差异应该要小得多,所以在这种情况下内存布局是什么。以及我在上面的解释中没有完全理解的是什么
【问题讨论】:
-
它们相差 120,895,728 字节,而不是 150 万字节。
-
“堆向下增长(从 0xFFF... 到 0x0000..)在堆下面有栈” 嗯?
-
请注意,这种分离不一定是物理的,因为基本上所有主要操作系统都有虚拟内存。
-
请注意,使用虚拟内存和地址转换,使用相距很远的两个内存区域基本上是免费的。见stackoverflow.com/questions/14347206/…
-
堆增长和堆增长是我们教给学生的简化概念(它可能也是非常旧的计算机使用的)。这种简化可以很好地解释这个概念,但实际上它更多地取决于操作系统。我的意思是,如果您愿意,您可以在堆内实现堆栈(堆栈只是堆栈帧的链接列表,它们不需要物理上连续(尽管这是一个非常简单的实现)。
标签: c++ stack heap-memory