如何在c ++ 11中返回类成员向量

CrS*_*rSe 10 c++ std c++11

我读了几篇关于如何从方法返回向量的帖子包括以下内容:

  1. c11 rvalues和移动语义混淆返回语句

  2. 希望速度超值

  3. 为什么visual studio不执行返回值优化rvo

  4. Wiki - 返回值优化

我仍然对如何在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)

这样您就可以在不需要复制的情况下读取对象.如果要写入返回的向量,请显式创建副本.更多细节可以在这个问题中找到