编译时间内存分配

时间:2011-08-10 13:37:13

标签: c++ compiler-construction

这似乎是一个非常基本的问题,但它与编译器的工作方式有关。 什么是函数局部变量的内存分配顺序。

假设我有一个功能

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

然后分配内存

这可能会发生,因为有各种编译阶段,这是其中之一。

这个堆栈构建的哪个阶段对应于哪个阶段是实际分配的内存?

4 个答案:

答案 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)

它依赖于编译器。它取决于解析器完成的解析类型(自顶向下或自底向上和向左或向右)。