Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回一个向量,这里是否应用了RVO或移动构造函数?_C++_Vector_Move_Move Semantics_Rvo - Fatal编程技术网

C++ 返回一个向量,这里是否应用了RVO或移动构造函数?

C++ 返回一个向量,这里是否应用了RVO或移动构造函数?,c++,vector,move,move-semantics,rvo,C++,Vector,Move,Move Semantics,Rvo,我有一个类,它有一个std::vector数据成员。然后我有一个简单的get member函数,它只按值返回数据成员 class X{ public: vector<shared_ptr<MyClass>> z; vector<shared_ptr<MyClass>> X::getVector(){ return z; } }; X类{ 公众: 向量z; 向量X::getVector(){ 返回z

我有一个类,它有一个std::vector数据成员。然后我有一个简单的get member函数,它只按值返回数据成员

class X{
    public:
    vector<shared_ptr<MyClass>> z;

    vector<shared_ptr<MyClass>> X::getVector(){
        return z;
    }
};
X类{
公众:
向量z;
向量X::getVector(){
返回z;
}
};
当我调用以下C++时:

std::vector<boost::shared_ptr<MyClass>> my_vec = obj->getVector();
std::vector 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)  
std::vector my_vec=obj->getVector();
mov-rdx,qword-ptr[r8+20h]
测试rdx,rdx
je增压::增压::+3DCh(013F0F690Ch)
lea rcx[x]
调用std::vector::vector(013F0E9700h)

我希望要么应用返回值优化(RVO),要么应用
std::vector
move构造函数。但是,我无法从x86中推断出哪一个?

否,成员从未自动移动。这将意外地使此无效


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

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

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

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

x86是否显示了这一点?我很有兴趣在将来学习如何识别它。我提到只有一个构造函数调用(或者说函数调用),而且由于副本必须反映在构造函数调用中,所以似乎存在RVO。然而,我们通常不会像这样读取可执行代码;使用调试器单步完成它更容易、更可靠。特别是,它看起来像是内联的函数,周围有一个空检查。很抱歉,我认为你误读了我的Q。从我提供的x86中,到底发生了什么?所以你提到了RVO,你能在x86中看到RVO吗?你在声明中使用了返回值,所以应用了复制构造。我假设您没有使用C++11,所以没有移动构造