我理解向量和列表之间关于它们的常见操作的复杂性的区别。但是假设我们需要处理非常大的列表或向量(即数百万个元素),我们可以说在使用向量时内存分配更可能失败吗?
AFAIK,在使用向量时,元素会连续存储。这意味着需要分配大块内存以存储所有元素,这在堆碎片的情况下似乎更有可能失败。
另一方面,使用列表时没有分配大块内存;元素不是连续存储的。
答案 0 :(得分:3)
肯定有std::list
比std::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)可能需要相同大小的向量所需内存量的三到五倍。随着列表元素的大小增加,额外的内存需求变得不那么明显,但对于小对象,其影响是巨大的。这就是为什么说向量更可能在内存分配上失败是不公平的:虽然向量需要一个连续的内存块,但总量可能要小很多,让你在进入之前有大小更大的向量。潜在失败的领土。
对于比两个指针大很多(比如十倍或更多倍)的对象,你可以安全地忽略额外的内存要求:由于需要向量来分配连续的空间,所以没有找到合适的内存块的可能性明显更高。