复制CTOR vs赋值运算符以初始化对象(性能)

时间:2018-04-28 03:19:54

标签: c++ initialization

我过去雇佣的15年经验丰富的明星开发人员声称,复制CTOR创建对象优于赋值运算符。 因此,

Object x = Object(5, "My Object"); // is inefficient
Object y(5, "My Object"); // is efficient

但是,通过以下测试代码,我看到编译器始终为上面的第一行调用Copy CTOR。 如:

class test_ctor
{
    public:
    explicit
    test_ctor(int x):_x(x)
   {
       std::cout << "CTOR: " << _x << "\n";
   }

   test_ctor & operator = (test_ctor const & y)
   {
       std::cout << "operator =: " << _x << "\n";
       _x = y._x;
       return *this;
   }
  private:
      int _x;
  };

 int main(int argc, const char * argv[]) {
     test_ctor const test = test_ctor(2);
     return 0; 
 }

由于我的前雇主认为他是明星开发者,我想知道我错过了什么。是否有任何编译器会有不同的做法(想想MS Windows 7 / Visual Studio 2010+和OpenSuse 10+ OS /编译器)?

1 个答案:

答案 0 :(得分:3)

首先,没有任务;他们都是初始化。所以这里不涉及assignmenet运算符。

Object x = Object(5, "My Object");表示直接初始化临时Object,然后使用它来复制初始化x; Object y(5, "My Object");表示直接初始化y。所以后者更有效率;在概念中。

根据copy elision(因为C ++ 17保证),两种初始化样式实际上具有相同的效果;对象都是直接初始化的(省略了复制操作)。