C++:为什么在 "normal" 整数之后分配堆栈上的数组,而不考虑代码中的顺序?
C++: Why are arrays on the stack allocated after "normal" ints for instance, regardless of ordering in the code?
对 c++ 编译器(在我的例子中是 linux 上的 g++)在堆栈上分配局部变量时的行为进行一些测试。
看看这个简单的代码:
#include <iostream>
int main()
{
int prev = 10;
int myArr[5] = {4, 5, 7, 2, 1};
int next = 10;
return 0;
}
所有这些变量都分配在堆栈上。
人们会认为堆栈的那一部分看起来像这样:
上一个 myArr 下一个
但是当用 gdb 检查堆栈时,它看起来像这样:
0x7fffffffd640: 0xf7dd1fc8 0x00007fff 0x0000000a 0x0000000a
0x7fffffffd650: 0x00000004 0x00000005 0x00000007 0x00000002
0x7fffffffd660: 0x00000001 0x00007fff 0x2cf9f100 0x09108235
从0x0000000a值可以看出,两个int变量都在数组之前分配。
为什么会这样?某种优化将较大的 int 数组放在较小的 4 字节整数之后,还是我遗漏了什么?
提前致谢
最好的问候
One would think that that segment of the stack looks like this:
prev myArr next
无法保证此顺序。
Some kind of optimization putting the larger int-array after the smaller 4byte ints or am i missing something?
是的,编译器可以随意排列对象。对象在堆栈上的顺序未指定,可能会有所不同。
当编译器认为不需要时,甚至可能根本不会在堆栈上分配变量。例如:
int main() {
int x = 42;
return x;
}
等同于
int main() {
return 42;
}
启用优化后,编译器应注意到这一点并利用 as-if-rule 生成优化输出。
对 c++ 编译器(在我的例子中是 linux 上的 g++)在堆栈上分配局部变量时的行为进行一些测试。 看看这个简单的代码:
#include <iostream>
int main()
{
int prev = 10;
int myArr[5] = {4, 5, 7, 2, 1};
int next = 10;
return 0;
}
所有这些变量都分配在堆栈上。 人们会认为堆栈的那一部分看起来像这样:
上一个 myArr 下一个
但是当用 gdb 检查堆栈时,它看起来像这样:
0x7fffffffd640: 0xf7dd1fc8 0x00007fff 0x0000000a 0x0000000a
0x7fffffffd650: 0x00000004 0x00000005 0x00000007 0x00000002
0x7fffffffd660: 0x00000001 0x00007fff 0x2cf9f100 0x09108235
从0x0000000a值可以看出,两个int变量都在数组之前分配。 为什么会这样?某种优化将较大的 int 数组放在较小的 4 字节整数之后,还是我遗漏了什么?
提前致谢 最好的问候
One would think that that segment of the stack looks like this:
prev myArr next
无法保证此顺序。
Some kind of optimization putting the larger int-array after the smaller 4byte ints or am i missing something?
是的,编译器可以随意排列对象。对象在堆栈上的顺序未指定,可能会有所不同。
当编译器认为不需要时,甚至可能根本不会在堆栈上分配变量。例如:
int main() {
int x = 42;
return x;
}
等同于
int main() {
return 42;
}
启用优化后,编译器应注意到这一点并利用 as-if-rule 生成优化输出。