c++ - 为什么 std::string::max_size 的值是 "strange"?

标签 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;
}

输出:

max_size: 4294967291

但是,我一直认为这个限制是由于无符号整数/size_t 的最大值造成的 - 所以我有点希望它是 2^32 - 1 也就是 4294967295 。为什么此示例中的最大大小不使用这 4 个字节?

我还尝试运行示例代码,在那台机器上它是 2^62 - 这又让我感到困惑,为什么不是 2^64 - 1 代替?

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

最佳答案

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

这给我们带来了标准库可以提供的 radix^bits - 3 的理论最大值(除非那些保留的位置可以共享相同的值;我不是 100% 确定会不可能)。大概实现选择了为内部使用保留两个索引(或者我错过了一些必要的保留位置)。我可以想象的这种保留索引的一种潜在用途可能是溢出陷阱,它检测越界访问。

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

关于c++ - 为什么 std::string::max_size 的值是 "strange"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54536456/

相关文章:

c++ - 使 C++ 插件异步

c++ - 与 std::mutex 相比,其他互斥包装器库有哪些优势?

c++ - 强制 cpp_dec_float 向下舍入

c++ - 从接收方的角度来看,我如何确保已收到使用 MPI_Isend 发送的所有消息?

c++ - 为什么这个 C++ 程序如此之快?

c++ - 如何处理 Qt 托盘应用程序中的 session 更改通知?

c++ - 如何简单地循环自定义比例

c++ - 在C++标准中,格式正确意味着代码可以编译吗?

c++ - pthread 窗口崩溃 C++

c++ - std::string 是否以 '/0' 终止?