为什么我得到deque的max_size()小于vector的max_size()?

时间:2013-02-25 05:49:54

标签: c++ gcc vector stl deque

在学习(和实验)STL容器时,我发现我的系统上的向量max_size = 4611686018427387903和deque max_size = 2305843009213693951(gcc版本4.7.2,x86_64)。从我的(有限的)理解中,deques通常在内部实​​现为向量列表(或向量的向量?)。如果是这种情况那么为什么deque的max_size小于一个向量,其中(向量)实际上需要连续的内存块,而deque可能能够与多个连续的块一起工作?它与我的系统配置,当前状态有什么关系,或者它是必须的?

2 个答案:

答案 0 :(得分:1)

我在你的问题中缺少一个细节:你用哪种类型测试max_sizes? Ideone的gcc 4.7.2(在32位上)说both have the same 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整数引入内存。 -1源于“第一个”4个字节必须留空的事实,或者&vec[0] == NULL。你不能在该程序中拥有任何其他数据,而不是存储在向量中的整数 - 包括向量本身!

答案 1 :(得分:0)

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

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

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