std::string
提供了一个 max_size()
方法来确定它可以包含的元素的最大数量。
然而,要想在一般情况下计算字符串的最大长度,程序员必须创建一个(可能为空的)字符串对象。
如果该类不需要任何来自程序员的信息,为什么不能将 max_size()
提供为编译时常量?是否有某种运行时信息对于字符串计算其最大大小是必要的?
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()
在很多情况下都没有用,而现有的措辞已经足够清晰,适用于max_size()
可以使用的少数情况。尝试更改现有措辞的所有尝试都没有带来改进。
std::string::max_size()
返回的是“如果有足够的内存,它可能容纳的最大字符串长度”。很惊讶这里有这么多错误的答案。 - Maxim Egorushkinstd::string::max_size()
调用 std::allocator::max_size()
。
根据标准的20.9.6.1.10:
size_type max_size() const noexcept;
返回:对于从调用 allocate(N,0) 可能成功的最大值 N。
(请参考:allocator::max_size)
理论上,分配器实现可以通过系统调用计算出它可以分配的内存块的最大大小。这将有助于确定特定进程中字符串的最大可能大小。
max_size
调用分配器的max_size
。标准对于string
的描述指的是第23.1节中的"容器要求",该节将max_size
定义为"可能的最大容器的size()
"。它根本没有涉及到分配器,因此这个回答是错误的。 - Nemo调用max_size()
的操作被委托给用于容器的分配器。
理论上,非常聪明的分配器可以在运行时计算其max_size
,例如,取决于可用的RAM。
string::max_size()
不需要这样做。我在谈论可能的实现方式。 - Andriy这个也应该可以工作:
enum : std::string::size_type {
npos = std::string::size_type(-1),
max_size = npos - 1
};
max_size
;对于分配器来说又是另外一回事)。 - Nemostd::string::npos
一样将其设置为const成员变量,但为了提供更多的灵活性,它是一个方法。 - Martin Yorkstd::vector
的内存连续时,你不在场。那异常规范呢?他们不是神,也会出错。C++03标准只说(23.1)“最大可能容器的size()
”,并且应该具有O(1)。在我看来,这相当模糊,并且留下了很多关于它的推测空间。 - sbi