У меня есть класс, который имеет член данных std :: vector. Затем у меня есть простая функция get member, которая просто возвращает член данных по значению.
class X{
public:
vector<shared_ptr<MyClass>> z;
vector<shared_ptr<MyClass>> X::getVector(){
return z;
}
};
Когда я вызываю следующий C ++:
std::vector<boost::shared_ptr<MyClass>> my_vec = obj->getVector();
этот x86 производится:
std::vector<boost::shared_ptr<MyClass>> my_vec = obj->getVector();
mov rdx,qword ptr [r8+20h]
test rdx,rdx
je boost::boost::+3DCh (013F0F690Ch)
lea rcx,[x]
call std::vector<boost::shared_ptr<MyClass>, std::allocator<boost::shared_ptr<MyClass> > >::vector (013F0E9700h)
Я ожидаю, что будет применена либо оптимизация доходности (RVO), либо std::vector
переместить конструктор Тем не менее, я не могу вывести, что из x86?
Нет, участник никогда не перемещается автоматически. Это неожиданно сделает недействительным this
,
Член z
копируется во временный, который затем либо перемещается, либо применяется RVO. Поскольку вы видите только один вызов конструктора, он выглядит как RVO.
RVO — действительно очень простая и старая оптимизация для компилятора, даже с cfront. Компилятор попытается построить объект на месте, если это возможно, и избавится от любого копирования / перемещения.
В вашем случае это так же, как:
std::vector<boost::shared_ptr<MyClass>> my_vec(obj->z);
Если вы хотите убедиться, что никакое дополнительное копирование / перемещение не вызывается, просто верните ссылку из getVector ();