std :: vector比std :: list更容易失败(STL容器)

时间:2013-04-02 19:04:49

标签: c++ stl

我理解向量和列表之间关于它们的常见操作的复杂性的区别。但是假设我们需要处理非常大的列表或向量(即数百万个元素),我们可以说在使用向量时内存分配更可能失败吗?

AFAIK,在使用向量时,元素会连续存储。这意味着需要分配大块内存以存储所有元素,这在堆碎片的情况下似乎更有可能失败。

另一方面,使用列表时没有分配大块内存;元素不是连续存储的。

2 个答案:

答案 0 :(得分:3)

肯定有std::liststd::vector更有可能继续工作的情况。最直接的一个是应用程序具有大量内存碎片。基本上,当分配在虚拟内存地址空间中分散时。这导致可用内存量与最大连续内存块之间存在较大差距。在这种情况下,与std::vector具有相同元素数量的std::list相比,std::vector更多可能会失败大量元素。

然而,我不会盲目地做出决定。如果有问题的应用程序遭受内存碎片影响,并且影响了我使用std::list的能力,那么我会考虑跳转到{{1}}。但是一开始我会选择最适合我需要的任何系列。

答案 1 :(得分:3)

比较是不完整的,没有提到两个容器带有不同的每元素内存要求:

  • 平均而言,大小为N的向量需要N*sizeof(T)个字节(您可能需要修剪内存以使其大小精确到N
  • 大小N的列表需要N*(sizeof(T)+2*sizeof(void*))个字节。

由于列表中的每个元素都带有两个附加指针,因此非常小的对象列表(例如,int s)可能需要相同大小的向量所需内存量的三到五倍。随着列表元素的大小增加,额外的内存需求变得不那么明显,但对于小对象,其影响是巨大的。这就是为什么说向量更可能在内存分配上失败是不公平的:虽然向量需要一个连续的内存块,但总量可能要小很多,让你在进入之前有大小更大的向量。潜在失败的领土。

对于比两个指针大很多(比如十倍或更多倍)的对象,你可以安全地忽略额外的内存要求:由于需要向量来分配连续的空间,所以没有找到合适的内存块的可能性明显更高。