C ++中的自动变量

时间:2011-07-06 20:02:51

标签: c++ memory stack heap automatic-properties

  

可能重复:
  In C++, why should new be used as little as possible?

C ++中分配的自动变量在哪里?在堆栈或堆上?

另外,我在 7.9 — The stack and the heap 中读到,在编译时已知在堆栈上分配的所有内存。这是真的吗?这是否意味着只在堆栈上发生静态内存分配?

另外,请提及链接,引用有关C ++中内存分配的完整说明文字。

4 个答案:

答案 0 :(得分:16)

C ++没有堆栈或堆的概念,就语言而言,它是一个实现细节

话虽这么说,我所知道的每个实现都使用堆栈来管理局部变量的生命周期。但是,许多局部变量可能最终完全位于寄存器内,并且从不触及堆栈,并且可能会完全优化一些局部变量。仅仅因为你声明一个自动变量并不意味着它将被放在堆栈上。

e.g。

int main()
{
    int x = rand();
    int y = 2;
    cout << x << y << endl;
    return 0;
}

在此代码中,通过优化,变量y几乎肯定会被完全删除,变量x可能会被赋予自己的寄存器。这些变量中的任何一个都不可能存在于堆栈中。

答案 1 :(得分:2)

堆上未分配自动(本地)变量。它们要么存在堆栈中,要么存在于寄存器中。

是的,所有堆栈分配都是在编译时知道的。

您引用的链接实际上是描述c ++如何处理内存的非常好的资源。

答案 2 :(得分:2)

是的,自动变量最常分配在堆栈上(C ++标准没有指定“堆栈”,但它足以安全地假设)。

您可以使用堆栈通过alloca()函数分配动态内存,但这不是一个很好的做法,在此问题中更多内容:Why is the use of alloca() not considered good practice?

答案 3 :(得分:0)

除了在寄存器或堆栈中定位一些局部变量之外,如果可以在编译时确定对象的可用寿命限于代码区域,则某些编译器可以选择重用特定的寄存器或内存。

例如,

{
int a;
// do something with a

int b;
// do something with b but nothing with a
}

编译器会注意到a和b的大小相同,但在b的生命周期中不会使用a。编译器会将a和b映射到同一个内存(堆栈或寄存器),从而节省了一些空间。