1

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

4

2 回答 2

1

我在您的问题中遗漏了一个细节:您使用哪些类型测试了 max_sizes?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整数放入内存。-1 源于“前”4 个字节必须留空,否则&vec[0] == NULL. 除了存储在向量中的整数之外,您在该程序中不能有任何其他数据——包括向量本身!

于 2013-02-25T08:27:49.933 回答
0

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

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

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

于 2013-02-25T06:11:21.077 回答