[英]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.