#include <iostream>
using namespace std;
void test() {
int a,b;
int *c = new int;
int *d = new int;
cout << &a << endl;
cout << &b << endl;
cout << c << endl;
cout << d << endl;
delete c;
delete d;
}
int main() {
test();
}
在我的电脑上运行的结果如下。请问栈不应该是向地址低的地方生长吗,为什么b的地址更高呢?
为什么堆分配的两个int变量地址相隔了20个字节呢?(多次运行都是20),谢谢!
0x7ffc5c793ed0
0x7ffc5c793ed4
0x16f1c20
0x16f1c40
在我机器上用g++ 6.4.0,不开启优化,
a
、b
的地址还是由高到低,开启优化后就变成由低到高了:这里是不是有什么玄机?然而用clang++再试,发现不管开不开启优化,都是由高到低分配的。编译器可以自行安排变量的地址,只要保证程序执行结果正确即可。所谓“栈向低地址生长”只是一个实现的模型,并不是绝对的。
至于
c
、d
,更没有规定说要连续分配了。实际上在向操作系统申请内存的时候,一般都是多给一些的,用不满就浪费了,没什么大不了。