返回一个向量,是在这里应用的RVO还是移动构造函数?

时间:2014-05-25 01:10:18

标签: c++ vector move move-semantics rvo

我有一个类,它有一个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中推断出哪一个?

2 个答案:

答案 0 :(得分:1)

不,会员永远不会自动移动。这会意外地使this失效。

将成员z复制到临时位置,然后移动临时位置或应用RVO。由于您只看到一个构造函数调用,它看起来像RVO。

答案 1 :(得分:0)

即使从cfront开始,RVO也是编译器的一个非常基础和旧的优化。如果可能,编译器将尝试在适当的位置构造对象,并删除任何复制/移动。 在您的情况下,它与:

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

如果你想确保没有调用额外的copy / move,只需从getVector()中重新引用一个引用;