34

std::string提供了一种max_size()方法来确定它可以包含的最大元素数。

然而,一般来说,要计算出字符串的最大长度,程序员必须创建一个(可能为空的)字符串对象。

如果这个类不需要程序员提供任何信息,为什么不能max_size()作为编译时常量使用?字符串计算其最大大小是否需要某种运行时信息?

4

4 回答 4

22

一个原因是该max_size功能根本不是很有用,委员会认为尝试修复它不值得。所以它就保持原样,因为它是文档化界面的一部分。

请参阅库缺陷报告 #197:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3440.html#197

max_size() 对很多事情都没有用,现有的措辞对于 max_size() 可以用于的少数情况来说已经足够清楚了。改变现有措辞的任何尝试都不是改进。

于 2012-10-30T12:34:23.423 回答
18

std::string::max_size()std::allocator::max_size()在引擎盖下调用。

根据标准,20.9.6.1.10:

size_type max_size() const noexcept;

返回: 调用 allocate(N,0) 可能成功的最大值 N。

(另见:分配器::max_size

从理论上讲,分配器实现可以计算出它可以通过系统调用分配的内存块的最大大小。这将有助于确定特定进程内字符串的最大可能大小。

于 2012-10-30T11:31:53.717 回答
5

调用max_size()委托给用于容器的分配器。

理论上,一个非常智能的分配器可以max_size在运行时计算它,例如取决于可用的 RAM。

于 2012-10-30T11:23:50.997 回答
0

这也应该有效:

enum : std::string::size_type {
    npos     = std::string::size_type(-1),
    max_size = npos - 1
};
于 2012-10-30T22:12:16.960 回答