堆栈上的C ++ Local var in dynamic?

时间:2012-04-11 08:36:06

标签: c++ dynamic stack local

假设我在动态内存(新)中有一个对象,并且在其中一个函数内部,它有

int Obj1::Add(int a, int b)
{
    int c = a + b;
    return c;
}

堆栈上有c(和a和b ......)吗?或者在我的对象的动态内存中。只是好奇:)谢谢

5 个答案:

答案 0 :(得分:3)

所有这些都将在堆栈中。 ab是传递的参数,因此即使原始文件在堆中,也会在堆栈上进行复制。如果你通过引用传递,它可能是另一回事,因为实际发送的东西(“引擎盖下”)将更多地指向原始的。

对于c,因为它是一个局部变量,所以它也在堆栈上。

当然,假设您的实现甚至使用堆栈,并且该优化不仅仅将它们存储到寄存器中。这完全取决于实施。

答案 1 :(得分:3)

在C ++标准中没有明确提到术语“堆栈”或“堆”。相反,需要C ++编译器来实现某些“存储持续时间”:

C++ call stack not in standard?

但是对于今天的处理器和编译器的实际用途,通常可以假设a / b / c在堆栈或寄存器中。

答案 2 :(得分:3)

这完全取决于编译器。在Sparc上,这三个都将在寄存器中,我希望这是最常见的情况。只有在Intel 32位(或16位,如果你回到过去),ab才会在堆栈上。

这些都与大部分内容无关。关于你的问题的关键点(我认为):它们都不会成为this引用的对象的一部分。然而编译器组织的东西,三个变量将在除对象之外的其他地方。即使对象本身在堆栈中,并且您在英特尔架构上,其中参数等也在堆栈上,对象和变量将位于堆栈的不同位置。

答案 3 :(得分:1)

abc位于堆栈中(或可能位于寄存器中)。

答案 4 :(得分:0)

他们都在堆栈中。但是,将c返回给调用者仍然是安全的,因为将进行复制。