为什么std :: string :: max_size的值"奇怪"?

Jul*_*ius 8 c++

我在看std :: string :: max_size并注意到了这个例子:

#include <iostream>
#include <string>

int main ()
{
  std::string str ("Test string");
  std::cout << "max_size: " << str.max_size() << "\n";
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

与输出:

max_size: 4294967291
Run Code Online (Sandbox Code Playgroud)

但是,我一直认为这个限制是由无符号整数/ size_t的最大值引起的 - 所以我有点期待它2^32 - 1会是什么4294967295.为什么此示例中的最大大小不使用这4个字节?

我也尝试运行示例代码,并在那台机器上2^62- 这再次让我感到困惑,为什么不2^64 - 1相反呢?

总的来说,我想知道,由于什么原因,实现不会使用所有空间?

eer*_*ika 6

其中一个索引,最大的可表示更具体,是为std::string::npos值保留的,这表示某些字符串函数中的"未找到"结果.此外,字符串在内部以空值终止,因此必须为空终止字符保留一个位置.

这使我们达到radix^bits - 3标准库可以提供的理论最大值(除非那些保留的位置可以共享相同的值;我不是百分之百肯定那是不可能的).据推测,该实施已经选择为内部使用保留两个以上的指数(或者我错过了一些必然保留的位置).我能想象的这种保留索引的一个潜在用法可能是溢出陷阱,它可以检测超出范围的访问.

从实际的角度来看:std::string::size_type通常与地址空间的宽度相同,并且在这种假设下,无论如何实际上不可能将整个地址空间用于单个字符串.因此,图书馆报告的数量通常是无法实现的; 它只是标准库实现设置的上限,字符串的实际大小限制受到其他来源的限制 - 通常是可用RAM的数量.