【问题标题】:Returning a vector in C++在 C++ 中返回一个向量
【发布时间】:2014-01-06 14:11:19
【问题描述】:

我刚刚阅读了this post on SO,它讨论了 STL 向量在内存中的存储位置。根据接受的答案,

vector<int> temp;

栈上向量的头信息,堆上的内容。

那么,下面的代码会出错吗?

vector<int> some_function() {
  vector<int> some_vector;
  some_vector.push_back(10);
  some_vector.push_back(20);
  return some_vector;
}

我应该改用vector&lt;int&gt; *some_vector = new vector&lt;int&gt; 吗?上面的代码会导致一些内存分配问题的代码吗?如果我使用自定义类的实例而不是 int,这种情况会改变吗?

【问题讨论】:

  • some_function 中的代码很好,可以正常工作。它将复制(使用复制构造函数)some_vector 的内容到接收向量中。
  • 你的函数很好,避免使用动态分配的内存,除非它真的需要并且你知道你在做什么。
  • @JoachimPileborg:实际上,我认为它会将向量移动。不会吗?
  • @yzt 在 C++11 编译器中,是的,它可能会。
  • 通过复制返回向量会更慢,对吧?我的意思是它必须将所有内容复制到接收向量中。如果您担心速度,请将向量移动到池中并返回指向它的指针。

标签: c++ vector stl


【解决方案1】:

你的代码很好。

向量管理它们为您分配的所有内存。

无论他们是使用动态分配来存储所有内部数据,还是将某些元数据作为直接成员(具有自动存储持续时间),都没有关系。任何内部执行的动态分配都将在向量的析构函数、复制构造函数和其他类似的特殊函数中安全地清除。

您无需执行任何操作,因为所有这些都已从您的代码中抽象出来。您的代码对该机制没有可见性,并且动态分配向量本身不会对其产生任何影响。

这就是他们的目的!

【讨论】:

    【解决方案2】:

    如果您决定动态分配向量,即使在非常简单的情况下也很难正确销毁它(不要忘记异常!)。尽可能避免动态分配。

    换句话说,您的代码完全正确。我不会担心将返回的向量复制到内存中。在这些简单的情况下,编译器(在发布版本中)应该使用返回值优化/RVO(http://en.wikipedia.org/wiki/Return_value_optimization)并在返回对象的内存中创建 some_vector。在 C++11 中,您可以使用移动语义。

    但如果你真的不信任使用 RVO 的编译器,你总是可以传递一个对向量的引用并将其填充到函数中。

    //function definition
    void some_function(vector<int> &v) { v.push_back(10); v.push_back(20); }
    
    //function usage
    vector<int> vec;
    some_function(vec);
    

    回到动态分配,如果你真的需要使用它,试试称为 RAII 的模式。或者使用智能指针。

    【讨论】:

      【解决方案3】:

      在内部向量定义其数据的位置并不重要,因为您通过副本返回向量。:)(按值)这与返回整数相同

      int some_function()
      {
         int x = 10;
         return x;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-02
        • 2021-01-26
        • 2014-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多