代码之家  ›  专栏  ›  技术社区  ›  Nailer

每次循环迭代都要清理向量。内存效率最高的方法是什么?

  •  5
  • Nailer  · 技术社区  · 17 年前

    我有一个关于std::vector的问题。

    我有一个非常内存密集的算法,在这里我看到预测向量大小并提前为向量保留足够的内存将在很大程度上帮助我减少内存使用。

    for ( ... ) {
      std::vector<Type> my_vector;
      my_vector.reserve(stuff_count);
      // Do stuff , and append stuff to my_vector.
    }
    

    或者这个:

    std::vector my_vector;
    for ( ... ) {
      my_vector.clear();
      my_vector.reserve(stuff_count);
      // Do stuff , and append stuff to my_vector.
    }
    

    请告诉我哪种方法最好,或者是否有更好的方法。

    9 回复  |  直到 17 年前
        1
  •  11
  •   sharptooth    17 年前

        2
  •  6
  •   Pete Kirkham    17 年前

    我认为预测向量大小并提前为向量保留足够的内存将在很大程度上帮助我减少内存使用。

    试着表现得像个工程师而不是算命师。创建一个测试,并测量差异。

        3
  •  5
  •   Maurice Perry    17 年前

        4
  •  5
  •   anon anon    17 年前

    由于代码中的差异很小,为什么不测试这两种方法,看看哪种方法最适合您的特定应用程序?

        5
  •  1
  •   Carl Seleborg    17 年前

    我想说,这有点取决于类型需要如何构造/解构。如果是不需要销毁的POD,可以跳过clear(),它调用循环中的所有析构函数,并将其用作静态数组:

    std::vector<Type> my_vector(size);
    for (...)
    {
      int index = 0;
      // Do stuff
      my_vector[index] = some_value;
    }
    

    (注意:代码未经测试)

        6
  •  1
  •   OJ.    17 年前

    减少内存使用

    犯错误什么这毫无意义。保留内存对减少内存使用没有任何帮助。它防止了不断重新分配的需要,使事情更快,但尽可能 你没有得到任何好处。

        7
  •  1
  •   MSN    17 年前

    std::vector::clear() does not necessarily free memory . 也就是说,如果你打电话 std::vector::capacity() 前后 std::vector::clear()

    使用上述方案最多可以减少分配内存的次数。但您肯定不会在任何时候减少内存占用。如果要缩小到保留的内存量,应使用向量交换习惯用法:

    std::vector<type>().swap(my_vector);
    my_vector.reserve(stuff_count); 
    

        8
  •  0
  •   Edouard A.    17 年前

    如果您需要执行大量的附加操作,请使用std::deque而不是std::vector,只需使用“push_back”。

        9
  •  0
  •   PiNoYBoY82    17 年前

    std::vector<DataType> my_vector;
    my_vector.resize(sizeof(yourData));
    memcpy(reinterpret_cast<char*>(&my_vector), &yourData, sizeof(yourData));