我有一个类,它有一个std :: vector数据成员。然后我有一个简单的get成员函数,它只是按值返回数据成员。
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 :(得分:1)
不,会员永远不会自动移动。这会意外地使this
失效。
将成员z
复制到临时位置,然后移动临时位置或应用RVO。由于您只看到一个构造函数调用,它看起来像RVO。
答案 1 :(得分:0)
即使从cfront开始,RVO也是编译器的一个非常基础和旧的优化。如果可能,编译器将尝试在适当的位置构造对象,并删除任何复制/移动。 在您的情况下,它与:
相同std::vector<boost::shared_ptr<MyClass>> my_vec(obj->z);
如果你想确保没有调用额外的copy / move,只需从getVector()中重新引用一个引用;