堆内存和栈内存中对象的区别解析

3
一种方法;
        Sterling operator+(const Sterling& o) const {
           return Sterling(*this) += o;
         }

这行代码"Sterling(*this) += o"会在堆栈内存中创建一个新的对象吗?如果是,如何将其返回给方法外部?

我可以这样做吗:

         Sterling operator+(const Sterling& o) const {
           return *this += o;
         }

因为我认为*这是一个对象,所以我们不需要创建一个新的对象?

3个回答

7
 Sterling operator+(const Sterling& o) const {
     return Sterling(*this) += o;
 }

创建一个对象在栈上,但你实际上并没有返回这个对象,而是返回它的一个副本。该函数执行以下操作:
  • 创建一个临时对象
  • 使用o调用临时对象的operator+=
  • 返回结果的副本 - 注意Sterling operator+(const Sterling& o) const - 如果是Sterling& operator+(const Sterling& o) const( *注意&* ), 那么这将是一个问题 )

无论如何,你的编译器都可以通过使用RVO来优化这个过程,避免复制局部对象。


第二个问题:

Sterling operator+(const Sterling& o) const {
   return *this += o;
}

这与第一种不同- 第一种情况创建临时对象并更改它,然后返回它。如果您执行第二个,则会更改 this 然后返回其副本。但请注意,this 对象已更改!


所以,总结一下- 两者都返回相同的结果,但第二种更改了 this。(如果您想重载 operator += 而不是 operator + ,那么这将非常有用)


2

在这里:

Sterling operator+(const Sterling& o) const {
   return Sterling(*this) += o;
}

一个临时对象被创建(在堆栈上,或者更准确地说,在自动存储中),然后修改临时对象并以其副本的形式从函数中返回(以某种实现定义的方式)。

这里:

Sterling operator+(const Sterling& o) const {
   return *this += o;
}

该方法被调用时,会改变当前对象(指调用该方法的对象),然后返回该对象的副本。

因此,主要区别在于当前对象是否被改变或使用临时对象。无论哪种情况,都会将改变后的对象复制并从函数中返回。


1
在你的例子中,Sterling 作为一个 按值传递 的对象被返回 -- 它被存储在栈上(或寄存器上,取决于编译器选择的方式)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接