我了解向量和列表之间关于它们的常见操作复杂性的区别。但是假设我们需要处理非常大的列表或向量(即数百万个元素),我们是否可以说在使用向量时内存分配更有可能失败?
AFAIK,在使用向量时,元素是连续存储的。这意味着需要分配一大块内存来存储所有元素,这在碎片堆的情况下似乎更有可能失败。
另一方面,使用列表时不会分配大块内存;元素不是连续存储的。
在某些情况下,std::list
a 比 a 更有可能继续工作std::vector
。最直接的一种是当应用程序具有大量内存碎片时。本质上,当分配分布在虚拟内存地址空间中时。这导致可用内存量与最大的连续内存块之间存在很大差距。在这种情况下,与具有相同数量的元素std::vector
相比,具有大量元素的失败的可能性更大。std::list
然而,这不是我盲目地做出决定的依据。如果有问题的应用程序出现内存碎片并且影响了我使用 an 的能力,std::vector
那么我会考虑跳到std::list
. 但一开始我会选择我认为最适合我需要的任何系列。
比较是不完整的,没有提到两个容器具有不同的每个元素的内存要求:
N
需要N*sizeof(T)
字节(您可能需要修剪内存以将大小精确到N
)N
需要N*(sizeof(T)+2*sizeof(void*))
字节。由于列表的每个元素都带有两个额外的指针,因此非常小的对象(例如int
s)的列表可能需要相同大小的向量所需的内存量的三到五倍。随着列表元素大小的增加,额外的内存需求变得不那么明显,但对于小对象,影响是巨大的。这就是为什么说向量更有可能在内存分配上失败是不公平的:虽然向量需要一个连续的内存块,但总量可能要小得多,让您在进入之前拥有更大尺寸的向量潜在故障的领域。
对于比两个指针大得多(例如十倍或更多)的对象,您可以放心地忽略额外的内存需求:由于需要向量来分配连续空间,找不到合适的内存块的可能性要高得多.