为什么 std::string::max_size 不是编译时常量?

Why isn't std::string::max_size a compile-time constant?

本文关键字:编译 常量 size std string max 为什么      更新时间:2023-10-16

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

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

如果此类不需要程序员的任何信息,为什么max_size()不作为编译时常数可用?是否需要某种运行时信息来计算其最大尺寸?

一个原因是max_size功能根本不是很有用,委员会认为尝试修复它是不值得的。因此,它只是离开的方式,因为它是已记录的接口的一部分。

请参阅图书馆缺陷报告#197:

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

max_size()对很多事情都没有用,并且对于麦克斯_size()可以使用的少数情况,现有措辞就足够清楚了。更改现有措辞的尝试都没有改进。

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

根据标准,20.9.6.1.10:

size_type max_size() const noexcept;

返回:呼叫分配(n,0)可能成功的最大值n。

(另请参见:分配器:: max_size)

从理论上讲,分配器实现可能能够通过SYSCALL分配的一块内存的最大大小。这将有助于确定特定过程内的字符串最大尺寸。

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

从理论上讲,非常聪明的分配器可以在运行时计算其max_size,例如取决于可用的RAM。

这也应该有效:

enum : std::string::size_type {
    npos     = std::string::size_type(-1),
    max_size = npos - 1
};