2

假使,假设

vector<vector<shared_ptr<Base>>> vec
vec.reserve(100)
vec[0].reserve(20)  // Error : vector subscript out of range

我正在尝试为外部向量和内部向量保留内存。我知道它vec是空的,所以我不能为内部向量保留内存。我只能resize()shrink_to_fit()之后。但是,使用resize()orshrink_to_fit()是无用的,因为那不是我想做的。

为内部向量保留内存的目的是尝试很好地分配内存,以便之后更快地搜索内部元素。我只是想知道如果我不保留内存,预先分配的内存既昂贵又混乱。

我想问一下 :

  1. 有没有办法为内部向量保留内存
  2. 我的“担心不为向量保留内存的情况下会导致内存分配不当”的概念正确吗?

对不起,我的英语很差,我正在使用 VC++ 2010。

4

3 回答 3

5

您不能为内部外部向量保留内存......如果您只在外部向量中保留空间,则不会构造内部向量。您可以调整外部向量的大小,然后对其每个元素进行保留,或者您可以在添加内部向量时对其进行保留。

于 2013-04-25T17:20:51.573 回答
2

如果您确定完全需要这样做,我可能会调整外部向量的大小,然后在每个内部向量中保留空间。

如果 100 个元素甚至接近准确,那么外部向量的空间几乎是无关紧要的(通常在 32 位系统上为 1200 字节,在 64 位系统上为 2400 字节)。

这可能不太方便(可能会迫使您跟踪创建的项目数量与实际使用的项目数量),但如果您想在内部向量中保留空间,您实际上并没有太多选择。

于 2013-04-25T17:21:03.343 回答
0

我将从您将如何与最终容器交互以及您提前了解其内容开始。一旦你确定了一个方便的接口,你就可以实现它背后的代码。例如,您可以确保每个新的内部向量都以 100 个元素的容量创建。或者,您可以使用从 x/y 对到共享指针的映射,这在人口稀少的容器中是有意义的。或者如何静态分配 100x100 元素而不重新分配?重要的一点是,所有这些替代方案都可以在不更改最终容器的接口的情况下实现,因此这使您可以自由地尝试不同的方法。

顺便说一句:查看 make_shared,我相信它避免了 shared_ptr 的分配开销。或者,Boost 也有一个使用内部引用计数器的 intrusive_ptr。这些 shared_ptr 实例也只有 shared_ptr 大小的一半。但是,您需要基准来实际证明哪种方式最快。其他任何事情都或多或少只是模糊的猜测和猜测。

于 2013-04-25T19:11:37.310 回答