繁体   English   中英

返回向量,是在这里应用RVO还是move构造函数?

[英]Returning a vector, is RVO or a move constructor being applied here?

我有一个类,它具有一个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 move构造函数。 但是,我无法从x86推断出哪个?

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

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

自从cfront以来,RVO实际上是编译器的非常基础和古老的优化。 如果可能,编译器将尝试在适当的位置构造对象,并摆脱任何复制/移动。 在您的情况下,它与:

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

如果要确保没有调用额外的复制/移动,只需从getVector()返回一个引用即可;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM