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

时间:2015-02-27 08:25:32

标签: c++ c++11 std

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

  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

  5. 我仍然对如何在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 个答案:

答案 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

中找到