c++ - 如何在 C++11 中返回类成员 vector

标签 c++ c++11 std

我读了几篇关于如何从方法返回 vector 的文章,包括这些:

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

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 中的 vector ?

最佳答案

//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;
}

这样你就可以读取对象而不需要复制。如果要写入返回的 vector ,请显式创建一个拷贝。更多详细信息,请参阅 this question

关于c++ - 如何在 C++11 中返回类成员 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28760475/

相关文章:

c++ - 使用自己的指针遍历数组元素

c++ - 调用 C++ 函数时指定默认参数

c++ - 如何在不授予私有(private)成员访问权限的情况下在 C++ 中隐藏 STL 仿函数结构

c++ - std::vector 中的二进制搜索

C++ 使用来自 const 函数的映射调用指向成员的指针

c++ - 参数类型不兼容的 MPI 错误 "char"到 "const char"c++

c++ - OPENFILENAME 对话框返回亚洲字母而不是文件路径

c++ - 快速、模板化、C++ 八叉树实现

c++ - 启用 -std=c++0x 时自定义分配器的编译问题

c++ - 使用复制昂贵的类作为 std::map 中的映射值是否有效?