这似乎是一个非常基本的问题,但它与编译器的工作方式有关。 什么是函数局部变量的内存分配顺序。
假设我有一个功能
int a,b;
int c1;
int c,d;
int c2;
cout<<&a<<endl;
cout<<&b<<endl;
cout<<&c<<endl;
cout<<&d<<endl;
cout<<&c1<<endl;
cout<<&c2<<endl;
int f;
cout<<&f<<endl;
这里f获取最低内存地址(相对于其他变量),好像初始化堆栈是这样构建的:
a b c1 c d c2 f
然后分配内存
这可能会发生,因为有各种编译阶段,这是其中之一。
这个堆栈构建的哪个阶段对应于哪个阶段是实际分配的内存?
答案 0 :(得分:6)
无法保证这些变量将占据哪些位置 - 定义顺序仅影响构造函数/析构函数调用的顺序。
答案 1 :(得分:2)
没有关于局部变量如何存储在内存中的规则,或如果存储它们 - 它们可能存在于整个函数的寄存器中。
它们中的一些甚至可能共享相同的内存位置(前提是它们具有不同的生命周期并且不会采用它们的地址)。
答案 2 :(得分:0)
代码中的顺序不一定与运行时内存中的顺序相关。
为了使结果更有趣,您可以使用不同大小的数据类型。
#include <iostream>
using std::cout;
using std::endl;
int main() {
int i0;
char c0, c1;
int i1;
short s0;
cout << &i0 << endl;
cout << (void *) &c0 << endl;
cout << (void *) &c1 << endl;
cout << &i1 << endl;
cout << &s0 << endl;
return 0;
}
在cygwin上使用g ++ 3.4.4,Windows XP,32位,-Os
我得到了以下结果:
0x22cce0
0x22ccdf
0x22ccde
0x22ccd8
0x22cce6
这表明编译器按变量大小而不是按声明顺序对变量进行分组。但总的来说,你不能依赖于此。例如,将优化级别更改为-O0
确实会改变我的顺序。
答案 3 :(得分:0)
它依赖于编译器。它取决于解析器完成的解析类型(自顶向下或自底向上和向左或向右)。