C ++中分配的自动变量在哪里?在堆栈或堆上?
另外,我在 7.9 — The stack and the heap 中读到,在编译时已知在堆栈上分配的所有内存。这是真的吗?这是否意味着只在堆栈上发生静态内存分配?
另外,请提及链接,引用有关C ++中内存分配的完整说明文字。
答案 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映射到同一个内存(堆栈或寄存器),从而节省了一些空间。