Возвращая вектор, RVO или конструктор перемещения применяются здесь?

У меня есть класс, который имеет член данных 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?

0

Решение

Нет, участник никогда не перемещается автоматически. Это неожиданно сделает недействительным this,

Член z копируется во временный, который затем либо перемещается, либо применяется RVO. Поскольку вы видите только один вызов конструктора, он выглядит как RVO.

1

Другие решения

RVO — действительно очень простая и старая оптимизация для компилятора, даже с cfront. Компилятор попытается построить объект на месте, если это возможно, и избавится от любого копирования / перемещения.
В вашем случае это так же, как:

std::vector<boost::shared_ptr<MyClass>> my_vec(obj->z);

Если вы хотите убедиться, что никакое дополнительное копирование / перемещение не вызывается, просто верните ссылку из getVector ();

0

По вопросам рекламы [email protected]