最近我注意到以下的说法是不真实的给予 std::string s.

s.max_size() == s.get_allocator().max_size();

我发现这很有趣,可通过默认 std::string 将使用 std::allocator<char> 其中有一个理论上的极限 size_type(-1) (是的,我知道,我在假设2中的补充,但是这是不相关的实际问题)。我知道,实际的限制将大大少于此。在一个典型的32位,x86系统的核心将会占据2GB(也许1GB)的地址空间留下一个小得多的实际上限。

无论如何,GNU般++'s std::basic_string<>::max_size() 出现返回的相同的价值无论什么样的分配是使用说(喜欢的东西 1073741820).

因此,问题仍然是,为什么不 std::basic_string<>::max_size() 刚刚返回 get_allocator().max_size()?在我看来,这是假设上限。如果分配来了短暂的,它将只是扔一个 std::bad_alloc, 为什么不试试?

这是更多的好奇心于别的,我只是想知道为什么这两个定义分别在至少这一次执行情况。

有帮助吗?

解决方案

Microsoft连接 是贴错误有关的问题。Microsoft具有有趣的回答:

我们已经解决了它作为设计按照我们的解释标准,该标准并不清楚地解释什么是预期的目的max_size()。分配max_size()被描述为"最大的价值,能够有意义地被传递给X::分配()"(C++03 20.1.5[lib。分配器。要求]/表32),但容器max_size()被描述为"大小()最大可能的容器"(23.1[lib。容器。要求]/表65)。没有什么描述是否或如何容器max_size()应该来自分配max_size().我们执行许多年来容器max_size()直接从分配max_size()以及随后使用这种价值对于溢出检查,等等。其他的解释标准,例如你的,都是可能的,但不是明确地正确的我们。标准的措词当然可以受益于澄清在这里。除非和直到发生这种情况,我们已经决定离开我们目前的执行情况不变,原因有两个:(1)其他客户可以根据我们目前的行为,和(2)max_size()根本不购买任何东西。最多事消耗分配(如容器)可能会使用分配max_size()预测,当分配()将失败,但只是要求分配()是一个更好的试验,因为分配,然后将决定给予出记忆或不行。事情使用的容器可以使用的容器max_size()作为一个保证有多大尺寸()可能是,但是一个更简单的保证是size_type的范围。

此外 在这里, 你能找到的核心问题#197.委员会认为请求改善措词的标准,但被拒绝。

所以回答你的问题"为什么..?"是这个标准没有清楚地解释什么是预期的目的max_size()。

其他提示

我不能完全肯定,但据我所知std::basic_string在目前的标准不限于存储在存储器中连续字符串。例如,它可以将其存储在几个块。然后每个这样的组块被限制为std::allocator::max_size()但总和可以比大。

此外,它似乎与STL容器的情况。和所有std::basic_string后为容器。

GCC的实现具有评论他们如何计算max_size(一个具有以减去其被分配为与字符串的单个块内部持家物体的大小),然后将其返回max_size()的四分之一。没有给出理由,也许这仅仅是一个安全边际? (还应提供一种绳索类,它或许人们会使用如此之大字符串?)

使用VC ++ max_size()返回一个小于allocator.max_size() - 可能以考虑终止空字符。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top