【问题标题】:Why did I get deque's max_size() less than vector's max_size()?为什么我得到 deque 的 max_size() 小于 vector 的 max_size()?
【发布时间】:2013-02-25 05:49:53
【问题描述】:

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

【问题讨论】:

    标签: c++ gcc vector stl deque


    【解决方案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 ints 放入内存中。 -1 源于“第一个”4 个字节必须留空,否则&vec[0] == NULL。除了存储在向量中的整数之外,您在该程序中不能有任何其他数据 - 包括向量本身!

    【讨论】:

    • 哦。奇妙的分析。我的错:(。你是对的。我无意中比较了使用不同的数据类型。我自己应该做更多的分析,但我错过了这个琐碎的事情,因为它是一个很长的程序。非常感谢
    【解决方案2】:

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

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

    这些数字非常大,实际上,在您接近 max_size 之前,您会看到其他事情发生爆炸。也许有一些古怪的 STL 实现,其中max_size 非常小,但至少对于 GCC,您无需担心。

    【讨论】:

    • 提示64位系统的答案? :)。无论如何,我不打算用那么多数据填充它,但想知道这种我不知道或不理解的反直觉行为(如果是的话)的真正和确切原因是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2012-10-19
    相关资源
    最近更新 更多