2

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

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

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

4

2 回答 2

3

在某些情况下,std::lista 比 a 更有可能继续工作std::vector。最直接的一种是当应用程序具有大量内存碎片时。本质上,当分配分布在虚拟内存地址空间中时。这导致可用内存量与最大的连续内存块之间存在很大差距。在这种情况下,与具有相同数量的元素std::vector相比,具有大量元素的失败的可能性更大。std::list

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

于 2013-04-02T19:09:44.957 回答
3

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

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

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

对于比两个指针大得多(例如十倍或更多)的对象,您可以放心地忽略额外的内存需求:由于需要向量来分配连续空间,找不到合适的内存块的可能性要高得多.

于 2013-04-02T19:13:57.703 回答