C++ C++;动态堆栈上的局部变量?

C++ C++;动态堆栈上的局部变量?,c++,dynamic,stack,local,C++,Dynamic,Stack,Local,假设我在动态内存中有一个对象(新),在它的一个函数中,它有 int Obj1::Add(int a, int b) { int c = a + b; return c; } c(以及a和b…)在堆栈上吗?或者在动态内存中使用我的对象。只是好奇:)谢谢a,b和c都在堆栈上(或可能在寄存器中)。所有这些都将在堆栈上a和b是传递的参数,因此,即使原始文件在堆中,也会在堆栈上进行复制。如果你是通过引用传递,这可能是另一回事,因为实际传递的东西(“引擎盖下”)更像是指向原始的指针 对于c

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

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

c(以及a和b…)在堆栈上吗?或者在动态内存中使用我的对象。只是好奇:)谢谢
a
b
c
都在堆栈上(或可能在寄存器中)。

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

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


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

它们都在堆栈上。但是,由于调用了一个副本,所以返回C给调用方仍然是安全的。

< P>没有明确提到C++中的术语“堆栈”或“堆”。相反,C++编译器需要以一定的“存储持续时间”来实现事物:


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

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


这些都与任何事情无关。关于你问题的关键点(我认为):它们都不是
this
引用的对象的一部分。无论编译器如何组织,这三个变量都将位于对象之外的其他位置。即使对象本身在堆栈上,并且您在Intel体系结构上,参数等也在堆栈上,对象和变量将位于堆栈上的不同位置。

a
b
是参数,因此它们可能不在堆栈上,除了像英特尔这样的寄存器极差的体系结构。在Sparc或AMD 64位处理器上,它们将位于寄存器中。(对于任何合适的优化器,
c
也会在寄存器中。)我可以轻松编写一个符合标准的实现,将其所有参数作为指向动态分配结构的指针传递(我看不出这样做的理由),所以我真的不会说在“任何”情况下它都不会在堆上;)