假设我在动态内存(新)中有一个对象,并且在其中一个函数内部,它有
int Obj1::Add(int a, int b)
{
int c = a + b;
return c;
}
堆栈上有c(和a和b ......)吗?或者在我的对象的动态内存中。只是好奇:)谢谢
答案 0 :(得分:3)
所有这些都将在堆栈中。 a
和b
是传递的参数,因此即使原始文件在堆中,也会在堆栈上进行复制。如果你通过引用传递,它可能是另一回事,因为实际发送的东西(“引擎盖下”)将更多地指向原始的。
对于c
,因为它是一个局部变量,所以它也在堆栈上。
当然,假设您的实现甚至使用堆栈,并且该优化不仅仅将它们存储到寄存器中。这完全取决于实施。
答案 1 :(得分:3)
在C ++标准中没有明确提到术语“堆栈”或“堆”。相反,需要C ++编译器来实现某些“存储持续时间”:
C++ call stack not in standard?
但是对于今天的处理器和编译器的实际用途,通常可以假设a / b / c在堆栈或寄存器中。
答案 2 :(得分:3)
这完全取决于编译器。在Sparc上,这三个都将在寄存器中,我希望这是最常见的情况。只有在Intel 32位(或16位,如果你回到过去),a
和b
才会在堆栈上。
这些都与大部分内容无关。关于你的问题的关键点(我认为):它们都不会成为this
引用的对象的一部分。然而编译器组织的东西,三个变量将在除对象之外的其他地方。即使对象本身在堆栈中,并且您在英特尔架构上,其中参数等也在堆栈上,对象和变量将位于堆栈的不同位置。
答案 3 :(得分:1)
a
,b
和c
位于堆栈中(或可能位于寄存器中)。
答案 4 :(得分:0)
他们都在堆栈中。但是,将c返回给调用者仍然是安全的,因为将进行复制。