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 生成优化输出。