Я пытался понять метод 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
-------
- I думал, что emplace back построит виджет "на месте" без необходимости копировать?
- Почему создание и копирование emplace_back не выполняется ни по парам, ни сгруппированы вместе?