【问题标题】:Move and copy constructor in C++ [duplicate]C ++中的移动和复制构造函数[重复]
【发布时间】:2023-03-11 00:24:02
【问题描述】:
#include <iostream>

class studant {
    public:
    studant () {
        std::cout<<"studant"<<std::endl;
    }
    studant(const  studant& a) {
        std::cout<<"copy studant (&)"<<std::endl;
    }
   studant(studant&& a) {
        std::cout<<"move studant (&)"<<std::endl;
    }
    studant maximum () {
        studant c1;
        return c1;
    }
};
studant create () {
     studant c1;
    return c1;
}
int main()
{
    studant c2;
    studant c3=c2.maximum ();
    studant c4=create ();
}

请看上面的代码为什么“studant c3=c2.maximum()”和“studant c4=create()”没有调用复制或移动构造函数。请解释一下。

【问题讨论】:

  • 您已经自己标记了答案:copy elision,编译器将在尽可能按值返回对象时应用它。
  • @PaulSanders 标签是由 David 的编辑添加的。
  • @t.niese 好的,抱歉,错过了。

标签: c++ copy-elision nrvo


【解决方案1】:

这是因为 RVO(返回值优化)。 studant c3=c2.maximum ()调用maximum(),编译器知道maximum()里面的c1会被返回,然后分配给c3,然后c1会被丢弃。编译器足够聪明,可以只创建一个 studant 实例来避免赋值。这意味着maximum() 中的c1c3 的实例相同。

函数“create()”中的“c4”和c1 也是如此。

【讨论】:

  • 这是一个正确答案,说明如果启用优化会发生这种情况。
  • @NadavS 对于未来的读者:在符合 C++17 的编译器上,无论是否启用优化都会发生 RVO。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 2017-12-17
  • 2023-03-28
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多