如何在 C++11 中 return 一个 class 成员向量

How to return a class member vector in c++11

我阅读了一些关于如何 return 来自方法的向量的帖子,包括这些:

  1. c11 rvalues and move semantics confusion return statement

  2. want speed pass by value

  3. why does visual studio not perform return value optimization rvo

  4. Wiki - Return Value Optimization

我仍然对如何在 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 中的向量?

//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 不会改变您的 class 状态,因此可以正确应用 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 相同,您只需更明确地调用 return 对象的移动构造函数即可。

对于性能,您可能真正想要的是:

const std::vector<int>& GetVect() const
{
    return vect;
}

这样你就可以读取对象而不需要复制。如果要写入 returned 向量,请显式创建一个副本。可以在 this question

中找到更多详细信息