0

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

4

2 回答 2

1

不,成员永远不会自动移动。那会意外地使this.

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

于 2014-05-25T01:16:14.163 回答
0

从 cfront 开始,RVO 确实是一个非常基本且古老的编译器优化。如果可能,编译器将尝试在适当的位置构造对象,并摆脱任何复制/移动。在您的情况下,它与以下内容相同:

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

如果您想确保没有调用额外的复制/移动,只需从 getVector() 中重新引用一个引用;

于 2014-05-25T08:30:28.940 回答