Извините, если об этом уже спрашивали, но, насколько я понимаю, в С++ 11 std::vector
имеет конструктор перемещения, так что копии почти ничего не стоят в определенных ситуациях, например, возвращая единицу по значению. Однако, если у меня есть такой класс с vector
в качестве переменной-члена:
class MyClass {
public:
MyClass() { }
MyClass(const MyClass& rhs) { }
// other interfaces
private:
std::vector<int> myvec;
// implementation
};
И есть функция, которая возвращает один из них по значению, например
MyClass somefunc() {
MyClass mc;
// fill mc.myvec with thousands (maybe even millions) of ints
return mc;
}
Будет ли вызываться конструктор перемещения mc.myvec
и использоваться конструктор перемещения std::vector
, даже если сам MyClass
ничего не знает о конструкторах перемещения? Или будет вызван конструктор копирования vector
и все эти тысячи (может быть, даже миллионы) int
должны быть скопированы один за другим?
MyClass mc; /* other code */ if (something) { mc = somefunc(); } else { mc = someotherfunc(); }
или иным образом используется возвращаемое значение функции в качестве правой стороны присваивания, то NRVO не препятствует копированию присваивания. Если вы собираетесь писать функции, основанные на NRVO для базовой эффективности, вам нужно убедиться, что класс либо эффективно перемещается, либо может быть эффективно заменен, чтобы выявить случаи, когда NRVO неприменим. - person Steve Jessop   schedule 24.11.2011