Запутался в emplace_back из std :: vector - PullRequest
1 голос
/ 23 марта 2020

Я пытался понять метод emplace_back, надеясь, что у него будет повышение производительности.

Для простого класса:

class Widget {
public:
  Widget(Widget&& w) {
    cout << "moving widget" << endl;
  }
  Widget(const Widget& w) {
    cout << "copying widget" << endl;
  }
  Widget() {
    cout << "constructing widget" << endl;
  }

  const Widget operator=(const Widget &w) {
    cout << "copy assign widget" << endl;
    return *this;
  }

  Widget operator=(Widget &&w) {
    cout << "move assign widget" << endl;
    return *this;
  }
  string name = "hello";
};

и используется так:

  vector<Widget> v { {Widget(), Widget(), Widget()} }; // 3 copy
  cout << "-------" << endl;
  vector<Widget> v2;
  v2.emplace_back();
  v2.emplace_back();
  v2.emplace_back(); // why still copying?
  cout << "-------" << endl;

имеет вывод:

constructing widget
constructing widget
constructing widget
copying widget
copying widget
copying widget
-------
constructing widget
constructing widget
copying widget
constructing widget
copying widget
copying widget
-------
  1. I думал, что emplace back построит виджет "на месте" без необходимости копировать?
  2. Почему создание и копирование emplace_back не выполняется ни по парам, ни сгруппированы вместе?

1 Ответ

4 голосов
/ 23 марта 2020

То, что вы видите здесь, - это эффект внутреннего роста и копирования ваших элементов.

Если бы ваши конструкторы / операторы перемещения были бы исключены, за исключением того, что они переместили бы их вместо этого.

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