为什么我得到的 deque max_size() 比矢量的 max_size() 少?

Why did I get deque's max_size() less than vector's max_size()?

本文关键字:size max 为什么 deque      更新时间:2023-10-16

在学习(和实验(STL容器时,我发现我的系统(gcc版本4.7.2,x86_64(上的向量max_size=4611686018427387903和deque max_size=2305843009213693951。根据我(有限(的理解,deques通常在内部实现为向量列表(或向量中的向量?(。如果是这样的话,那么为什么deque的max_size小于向量的max_ssize,而向量实际上需要连续的内存块,并且deque可以与多个连续的块一起工作?它与我的系统配置、当前状态有什么关系吗?还是它必须是这样的?

我在你的问题中缺少一个细节:你用哪些类型测试了max_size?Ideone的gcc 4.7.2(在32位上(说,如果给定相同的元素类型,那么两者都具有相同的max_size。对于int,它的2^30-1-这意味着存储数据的最大大小是(2^32 - 4)字节,因为该系统上的sizeof(int) == 4

这是一个疯狂的猜测:你有没有把vector<T>::max_sizedeque<U>::max_sizesizeof(T) == 4sizeof(U) == 8进行比较?这将解释近似因子2。

尽管如此,你的实验表明,max_size只返回一个非常理论的数字,因为你肯定无法将2^62-1 int输入内存。-1源于"前"4个字节必须为空,否则为&vec[0] == NULL。除了存储在向量中的int之外,该程序中不可能有任何其他数据——包括向量本身!

您可能已经注意到,4611686018427387903是2^62 - 1,2305843009213693951是2^61 - 1,这应该会提示您这些数字的来源(提示:与系统配置无关(。

我不知道真正的原因,但我想这是非常学术性的,与矢量或deques的实现方式无关。也许GCC的deque使用了额外的一点来跟踪其他东西。熟悉GCC的人可能会在这里插话。无论如何,语言标准没有说明max_size应该是什么,所以它完全取决于库/编译器实现者。

这些数字非常大,在实践中,在接近max_size之前,你会看到其他事情爆炸。也许有一些奇怪的STL实现,其中max_size非常小,但至少对于GCC,您不需要担心它。