我读了几篇关于如何从方法中返回向量的帖子包括以下内容:
why does visual studio not perform return value optimization rvo
我仍然对如何在VS2013中以正确的方式传递向量感到困惑,并且此代码中的以下方法之间存在差异(问题在注释中标出):
class Foo{
private:
std::vector<int> vect;
public:
//1 - classic way?
void GetVect(std::vector<int>& v)
{
v = vect;// assignment with swap?
}
//2 - RVO?
std::vector<int> GetVect()
{
return vect;
}
//3 - RVO with const?
std::vector<int> GetVect() const
{
return vect;
}
//4 - just move?
std::vector<int> GetVect()
{
return std::move(vect);
}
//5 - move with {}?
std::vector<int> GetVect()
{
return { std::move(vect) };
}
}
所以我不确定// 1是否是// 2的显式形式,不确定3是否有效。 4和5之间有什么区别?如果RVO适用于VS2013中的矢量,如何测试?
答案 0 :(得分:10)
//1 - classic way?
void GetVect(std::vector<int>& v)
{
v = vect;// assignment with swap?
}
这很简单,你仍然需要一份副本,而你的界面太复杂了。
//2 - RVO?
std::vector<int> GetVect()
{
return vect;
}
//3 - RVO with const?
std::vector<int> GetVect() const
{
return vect;
}
功能相同,但您可能希望3表示getVect
不会更改您的类状态,因此可以正确应用const
语义。
//4 - just move?
std::vector<int> GetVect()
{
return std::move(vect);
}
在调用GetVect
之后,您似乎不太可能想要此内容vect
将不再包含任何元素。
//5 - move with {}?
std::vector<int> GetVect()
{
return { std::move(vect) };
}
这应该最终与4相同,你只需要更明确地调用返回对象的移动构造函数。
对于性能您可能真正想要的是:
const std::vector<int>& GetVect() const
{
return vect;
}
这样您就可以在不需要复制的情况下读取对象。如果要写入返回的向量,请显式创建副本。更多详情可在this question
中找到