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