std::size和std::map的最大大小是多少?

4

std::size和std::map的最大大小是多少?是否有方法可以增加这个数字?

谢谢!


3
你的问题是什么是 std::size 的最大大小? - πάντα ῥεῖ
std::map::max_size 返回你的 map 可以容纳的最大大小。 - andre
1
真正的限制可能是系统资源,特别是RAM、交换空间... - Basile Starynkevitch
这将取决于您底层操作系统以及在堆上分配内存的限制,我个人认为。 - πάντα ῥεῖ
std::map::max_size()会返回一个保证不会超过的大小。然而,它通常甚至不会接近这个大小,并且该函数被认为不是很有用 - Bo Persson
3个回答

4

您可以通过调用标准库容器的Container::max_size()函数获取其最大大小。如果您需要在编译时获取理论上的最大大小值,请使用std::numeric_limits<Container::size_type>::max()


1
仅仅因为在某些容器的实现中max_size()返回std::numeric_limits<size_type>::max()并不意味着用户可以直接使用std::numeric_limits<size_type>::max()来确定容器的最大大小。 - AnT stands with Russia
1
@AndreyT,什么?max_size()返回size_typenumeric_limits<size_type>::max()返回constexpr size_type。我认为两者都是相同的类型,因此都是代表相同概念的数字 - 但一个考虑了运行时环境,而另一个在编译时解决。 - Griwes
1
@AndreyT,什么?size_type用于表示元素的数量,而不是它们的总大小(以字节为单位)。这是一个巨大的误解。 - Griwes
2
我不明白争论的焦点在哪里。std::numeric_limits<Container::size_type>::max()是容器大小的上限。Container::max_size()也是容器大小的上限,但它是一个更紧密的上限,因此更有用。无论如何,并不能保证实际上可以创建这么大的容器,我能想到的唯一用例是对输入值进行合理性检查。 - Yakov Galka
1
@AndreyT:那么我会说唯一有用的答案是“无法知道容器的最大大小,因为它们在运行时实际上受到资源量的限制,因此应编写异常安全代码并依赖于抛出bad_alloc”。 - Yakov Galka
显示剩余10条评论

3
任何标准容器的最大大小由container<T>::max_size()方法给出。一般情况下,这个大小可能会比container<T>::size_type的范围小(也确实如此)。
可以通过std::numeric_limits获取container::size_type的范围,但要记住,容器不能保证它们的最大大小能够达到其size_type的完整范围。
还要注意,container<T>::max_size()返回容器中最多的元素数量,而std::numeric_limits<container<T>::size_type>::max()返回size_type的范围。这些值是不可比较的。

这与被接受的答案相矛盾,你能提供一些参考资料来支持吗? - 463035818_is_not_a_number
@tobi303:首先,我没有看到矛盾之处。其次,标准中max_size()的规范是我的参考。第三,您也可以在任何编译器中尝试一下max_size()通常会做什么。对于std::vector<T>,您通常会看到std::numeric_limits<std::vector<T>::size_type>::max() / sizeof(T)。这不一定是可达到的,但思路是清晰的。 - AnT stands with Russia
啊好的,我误读了另一个答案,它说“理论上最大尺寸是 std::numeric_limits<Container::size_type>::max()”,但实际上最大尺寸可能会更小。 - 463035818_is_not_a_number
1
@tobi303:是的。max_size()也不需要精确。例如,在GCC中,std::vector<T>::max_size()返回std::numeric_limits<std::vector<T>::size_type>::max() / sizeof(T)。但是,即使如此,也无法达到这个值,因为GCC拒绝分配大小为SIZE_MAX的内存块。它只能分配最多SIZE_MAX / 2,这意味着std::vector<T>实际最大大小比max_size()报告的要小约两倍。 - AnT stands with Russia

1

理论极限是size_t可以包含的最大数量,通常用于返回容器中元素的数量。对于大多数32位平台,它是2^32,对于大多数64位平台,它是2^64,但实际上这是实现定义的,在标准中没有强制限制。

但实际上,任何容器的可能最大大小都要小得多,因为它受可用内存地址空间和可用空闲内存的限制。


需要说明的是,在32位平台上,通常在分配了约3GB的内存后才会得到bac_alloc - yo'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接