【问题标题】:C++ Local var in dynamic, on stack?C++ Local var 在动态中,在堆栈上?
【发布时间】:2012-04-23 13:21:41
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ dynamic stack local


    【解决方案1】:

    所有这些都将在堆栈上。 ab 是传递参数,因此即使原始文件在堆中,也会在堆栈上创建副本。如果您通过引用传递,则可能是另一回事,因为实际发送的内容(“幕后”)将更像是指向原始内容的指针。

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

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

    【讨论】:

    • ab 是参数,因此它们可能不会在堆栈上,除非在像 Intel 这样的寄存器极差的架构上。在 Sparc 或 AMD 64 位处理器上,它们将位于寄存器中。 (对于任何体面的优化器,c 也将在寄存器中。)
    • 我可以轻松编写一个符合标准的实现,将其所有参数作为指向动态分配的结构的指针传递(并不是我认为这样做有什么好的理由),所以我真的不会说“任何”情况下它都不会在堆上;)
    【解决方案2】:

    C++ 标准中没有明确提及术语“堆栈”或“堆”。相反,需要 C++ 编译器根据特定的“存储持续时间”来实现事物:

    C++ call stack not in standard?

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          它们都在堆栈上。但是,将 c 返回给调用者仍然是安全的,因为会生成一个副本。

          【讨论】:

            猜你喜欢
            • 2023-01-11
            • 1970-01-01
            • 2011-09-14
            • 2014-12-14
            • 1970-01-01
            • 1970-01-01
            • 2013-02-11
            • 1970-01-01
            • 2012-12-20
            相关资源
            最近更新 更多