【问题标题】:How to return a class member vector in c++11如何在 C++11 中返回类成员向量
【发布时间】:2015-04-29 21:27:10
【问题描述】:

我阅读了几篇关于如何从方法中返回向量的帖子,其中包括:

  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 中以正确的方式传递向量以及此代码中以下方法之间有什么区别感到困惑(问题在 cmets 中标记):

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 中的向量,如何测试它?

【问题讨论】:

  • 我很困惑。当您的 GetVect() 暗示它是一个 getter 函数时,您为什么还要担心复制省略和移动?
  • Foo 是否拥有该向量? GetVec 是否应该授予对向量的只读访问权限?它应该允许写入向量吗?它应该转让所有权吗?这些问题的答案对于正确设计课程很重要。
  • 您只想公开实际的std::vector 或其值吗? IE。通过引用传递对您来说重要吗?
  • 搬家当然不是这里的“替代方案”。它的作用与不动完全不同。
  • 你想要的语义是什么?

标签: c++ c++11 std


【解决方案1】:
//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

【讨论】:

猜你喜欢
  • 2014-11-24
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 2016-12-30
  • 2017-03-25
  • 1970-01-01
  • 2014-12-08
相关资源
最近更新 更多