如何在施工时为std :: vector保留内存?

时间:2015-08-07 17:00:46

标签: c++ stdvector

通常我在构建reserve后立即致电std::vector。这通常不会导致std::vector现有的堆分配被销毁并替换为新的堆分配吗?有没有办法在构建时保留内存而不是分配堆空间然后立即销毁它?或者std::vector中是否有实施技巧以确保这不是问题?

可用的构造函数似乎只能用于使用值填充std::vector,而不是明确地保留空间。

4 个答案:

答案 0 :(得分:10)

您的问题基于错误的前提,即默认构造的std::vector<T>将执行[零长度]分配。

实际上没有理由这样做。一个新的载体应该具有容量(虽然这是理智所要求的,而不是标准所要求的。)

因此,您的目标已经天生就满足了。

说实话,标准库并不是 愚蠢。

答案 1 :(得分:0)

如果您在编译时知道元素的数量,则可以使用以下元素列出初始化向量:

 class MyClass 
 {
      int x, y, z;
      std::vector<int> v;

  public:
         MyClass(int X, int Y, int Z) : x(X), y(Y), z(Z), v{x, y, z}
         {}
 };

但这并不是很好维护。还有更多高级技术,例如可以使std::vector使用的自定义分配器可以从预先分配的内存池中获取内存,例如:我怀疑你确实需要它。现代实施可以轻松优化这么简单的问题。

答案 2 :(得分:0)

原因可能具有讽刺意味,我们的功能签名已经用完了。

要求来自使用场景,我们确切地知道我们将保存多少元素到vector中但我们真的不喜欢n-duplicated元素构造函数:

for i, txt in enumerate(names): 
    if x[i] > 2 or y[i] > 2: 
        # annotate only if a point is having either x > 2 or y > 2.
        ax.annotate(txt, (x[i], y[i]), alpha=0.6)

不幸的是,签名被上面的构造函数占用。任何其他可能的签名都可能导致问题E.g。

  1. std::vector( size_type count, const T& value = T()) 将与vector(size_type count, size_type reserve_count)向量的上述n重复元素构造函数冲突。

  2. T(size_type)是一种可能的解决方案,但它太长而且仍然很无聊。我们需要在调用vector(size_type count, const T& value = T(), size_type reserve_count)

  3. 时构建一个我们从不使用的默认值

    其他可行的解决方案:

    1. 提供类似make_pair / make_unique的功能。

    2. 定义从Allocator派生的Reserver,因此我们可以使用构造函数向量(const Allocator&amp; alloc),如

    3. auto v = vector<T>(0, T(), reserve_count)

答案 3 :(得分:-1)

对象std::vector及其元素数组不存在于同一个连续的内存块中,否则每次调整数组大小时其地址都会发生变化,从而无法保持对它的可靠引用。对象的主体仅包含控制变量和指向实际数组的指针,它将在堆栈中实例化(假设您将其用作局部变量)以及其他局部变量。此时数组将为空,可能由指向nullptr的指针表示。因此,如果你reserve在构造时或之后,没有重要的优化发生。

如果您希望std::vector具有即时保留的静态大小,则可以使用常规C数组而不是std::vector。只要确保它适合堆栈。