我读了几篇关于如何从方法返回向量的帖子包括以下内容:
我仍然对如何在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) };
}
}
Run Code Online (Sandbox Code Playgroud)
所以我不确定// 1是否是// 2的显式形式,不确定3是否有效.4和5之间有什么区别?如果RVO适用于VS2013中的矢量,如何测试?
Kil*_*nDS 10
//1 - classic way?
void GetVect(std::vector<int>& v)
{
v = vect;// assignment with swap?
}
Run Code Online (Sandbox Code Playgroud)
这只是简单的丑陋,你仍然需要一个副本,你使你的界面太复杂.
//2 - RVO?
std::vector<int> GetVect()
{
return vect;
}
//3 - RVO with const?
std::vector<int> GetVect() const
{
return vect;
}
Run Code Online (Sandbox Code Playgroud)
在功能上相同,但您可能希望3表示getVect不会更改您的类状态,因此const可以正确应用语义.
//4 - just move?
std::vector<int> GetVect()
{
return std::move(vect);
}
Run Code Online (Sandbox Code Playgroud)
在调用GetVect内部vect将不再包含任何元素之后,您似乎不太可能想要这个.
//5 - move with {}?
std::vector<int> GetVect()
{
return { std::move(vect) };
}
Run Code Online (Sandbox Code Playgroud)
这应该最终与4相同,您只需更明确地调用返回对象的移动构造函数.
对于性能您可能真正想要的是:
const std::vector<int>& GetVect() const
{
return vect;
}
Run Code Online (Sandbox Code Playgroud)
这样您就可以在不需要复制的情况下读取对象.如果要写入返回的向量,请显式创建副本.更多细节可以在这个问题中找到
| 归档时间: |
|
| 查看次数: |
6177 次 |
| 最近记录: |