C++ std::vector是否比std::list(STL容器)更容易失败

C++ std::vector是否比std::list(STL容器)更容易失败,c++,stl,C++,Stl,我理解向量和列表之间的区别,即它们的常见操作的复杂性。但是假设我们需要处理非常大的列表或向量(即数百万个元素),我们能说在处理向量时内存分配更容易失败吗 另外,当使用向量时,元素是连续存储的。这意味着需要分配一大块内存来存储所有元素,这在碎片堆的情况下更可能失败 另一方面,在处理列表时,不会分配大的内存块;元素不是连续存储的。在某些情况下,std::list比std::vector更有可能继续工作。最直接的一种是当应用程序有大量内存碎片时。基本上,当分配分布在虚拟内存地址空间中时。这导致可用内存

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

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


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

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


然而,这并不是我盲目做出决定的依据。如果所涉及的应用程序遭受内存碎片并影响了我使用<代码> STD::vector < /代码>的能力,那么我会考虑跳转到<代码> STD::列表。但一开始,我会选择我认为最适合我需要的任何收藏品

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

  • 平均而言,大小为
    N
    的向量需要
    N*sizeof(T)
    字节(您可能需要修剪内存以使大小精确到
    N
  • 大小
    N
    的列表需要
    N*(sizeof(T)+2*sizeof(void*)
    字节
由于列表的每个元素都带有两个额外的指针,因此非常小的对象列表(例如,
int
s)可能需要三到五倍于相同大小的向量所需的内存量。随着列表元素大小的增加,额外的内存需求变得不那么明显,但对于小对象,其影响是巨大的。这就是为什么说向量更有可能在内存分配上失败是不公平的:尽管向量需要一个连续的内存块,但总量可能要小得多,这样在进入潜在故障区域之前,就可以拥有大得多的向量


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

“似乎”是一个神奇的词。由于现代(即20世纪90年代后)计算机的虚拟内存体系结构,实际上为“几百万个元素”获取内存是没有问题的。我想你已经抓住了区别。一个列表通常会为每个数据项添加两个指针,因此总体内存使用率高于向量。请阅读
std::deque
。它像
list
一样是非连续的,使用更少的内存并允许随机访问。这取决于您所说的失败是什么意思。
std::vector
需要连续内存(虚拟内存地址),但简单类型的内存远远少于
std::list
。使用
std::list
比使用
std::vector
更有可能耗尽内存。我们可以忽略这两个指针。我没有提到,但我考虑的是大对象列表,而不是简单的整数。我觉得这个分析有点简单。。。对于简单/小型类型,
std::list
的开销比
std::vector
的开销大得多,因此您也可以声称,如果您预先估计并
std::list
一个近似数,那么使用
std::vector
会比使用
std::vector
更容易耗尽内存。。。在这两个方向上发表声明有很多未知数。“DavidRodr Guez Dr.BeNeas”肯定有其他的情况需要考虑。我的意图是概述一个具体场景,其中一个集合比另一个集合更容易失败。还有许多其他的情况存在,可能以某种方式影响你。