为什么我得到的 deque max_size() 比矢量的 max_size() 少?
Why did I get deque's max_size() less than vector's max_size()?
在学习(和实验(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_size
和deque<U>::max_size
与sizeof(T) == 4
和sizeof(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,您不需要担心它。
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么(-1)%vector::size()总是返回0
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- <streamsize>C++ 中 numeric_limits::max() 的值
- 黑客级别的Mini-Max Sum
- 'max'匹配'std::function<const int &(const int &, const int &)>'无过载
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 关于 std::min, std::max 中的比较运算符的混淆
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- vector.size() 在比较中意外工作
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 返回 str vs. str.substr(0,str.size()) 在 leetcode 中给了我不同的输出
- std::max() 函数与定点实现的比较中的问题
- 使用 CImg 库的 std::min 和 std::max 的编译问题
- 为什么 GCC 不能假设 std::vector::size 在这个循环中不会改变?
- 为什么"(!v.empty())"比"(v.size() >0)"好?
- 在 3ds Max 中更新进度条后,环境和效果 UI 不刷新