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

sla*_*ppy 33 c++ string compile-time-constant

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

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

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

Bo *_*son 21

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

参见图书馆缺陷报告#197:

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

max_size()对于很多东西都没有用,现有的措辞对于max_size()可以用于的少数情况来说是足够清楚的.改变现有措辞的尝试都没有改进.


sla*_*ppy 18

std::string::max_size()std::allocator::max_size()引擎盖下的电话.

根据标准,20.9.6.1.10:

size_type max_size() const noexcept;

返回:调用分配(N,0)可能成功的最大值N.

(另请参阅:allocator :: max_size)

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

  • 标准确实_not_要求字符串的'max_size`来调用分配器的`max_size`.标准对`string`的描述是指第23.1节中的"容器要求",它将`max_size`定义为最大可能容器的"`size()`".它根本不涉及分配器,所以这个答案是错误的. (5认同)

And*_*rey 5

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

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