Копировать CTOR против оператора присваивания для инициализации объекта (производительность) - PullRequest
0 голосов
/ 28 апреля 2018

Один из моих прошлых работодателей, 15-летний опытный разработчик, утверждает, что Copy 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+)?

1 Ответ

0 голосов
/ 28 апреля 2018

Во-первых, нет назначения; они все инициализации. Так что оператор присвоения здесь не задействован.

Object x = Object(5, "My Object"); означает прямую инициализацию временного Object, а затем использует его для копирования-инициализации x; Object y(5, "My Object"); означает прямую инициализацию y. Таким образом, последний более эффективен; в концепции.

Согласно copy elision (поскольку C ++ 17 это гарантировано), два стиля инициализации фактически имеют одинаковый эффект; оба объекта инициализируются напрямую (операция копирования опущена).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...