【发布时间】:2012-04-23 13:21:41
【问题描述】:
假设我在动态内存(新)中有一个对象,并且在它的一个函数中,它有
int Obj1::Add(int a, int b)
{
int c = a + b;
return c;
}
c(以及 a 和 b...)在堆栈上吗?或在我的对象的动态内存中。只是好奇:) 谢谢
【问题讨论】:
假设我在动态内存(新)中有一个对象,并且在它的一个函数中,它有
int Obj1::Add(int a, int b)
{
int c = a + b;
return c;
}
c(以及 a 和 b...)在堆栈上吗?或在我的对象的动态内存中。只是好奇:) 谢谢
【问题讨论】:
所有这些都将在堆栈上。 a 和 b 是传递参数,因此即使原始文件在堆中,也会在堆栈上创建副本。如果您通过引用传递,则可能是另一回事,因为实际发送的内容(“幕后”)将更像是指向原始内容的指针。
对于c,因为它是一个局部变量,所以它也在堆栈上。
这当然是假设您的实现甚至使用一个堆栈,并且该优化不仅仅将它们存储到寄存器中。这完全取决于实施。
【讨论】:
a 和 b 是参数,因此它们可能不会在堆栈上,除非在像 Intel 这样的寄存器极差的架构上。在 Sparc 或 AMD 64 位处理器上,它们将位于寄存器中。 (对于任何体面的优化器,c 也将在寄存器中。)
C++ 标准中没有明确提及术语“堆栈”或“堆”。相反,需要 C++ 编译器根据特定的“存储持续时间”来实现事物:
C++ call stack not in standard?
但对于当今的处理器和编译器的实际用途,您通常可以假设 a/b/c 位于堆栈或寄存器中。
【讨论】:
这完全取决于编译器。在 Sparc 上,所有三个都将在寄存器中,我希望这是最常见的情况。只有在 Intel 32 位(或 16 位,如果您及时返回)上,a 和 b 才会在堆栈中。
这些都与任何事情都不相关。关于您问题的关键点(我认为):它们都不会成为this 引用的对象的一部分。无论编译器如何组织事物,这三个变量都将位于对象之外的其他地方。即使对象本身在堆栈上,并且您在 Intel 架构上,参数等也在堆栈上,但对象和变量将位于堆栈上的不同位置。
【讨论】:
a、b 和 c 在堆栈中(或可能在寄存器中)。
【讨论】:
它们都在堆栈上。但是,将 c 返回给调用者仍然是安全的,因为会生成一个副本。
【讨论】: