我在看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相反呢?
总的来说,我想知道,由于什么原因,实现不会使用所有空间?
其中一个索引,最大的可表示更具体,是为std::string::npos值保留的,这表示某些字符串函数中的"未找到"结果.此外,字符串在内部以空值终止,因此必须为空终止字符保留一个位置.
这使我们达到radix^bits - 3标准库可以提供的理论最大值(除非那些保留的位置可以共享相同的值;我不是百分之百肯定那是不可能的).据推测,该实施已经选择为内部使用保留两个以上的指数(或者我错过了一些必然保留的位置).我能想象的这种保留索引的一个潜在用法可能是溢出陷阱,它可以检测超出范围的访问.
从实际的角度来看:std::string::size_type通常与地址空间的宽度相同,并且在这种假设下,无论如何实际上不可能将整个地址空间用于单个字符串.因此,图书馆报告的数量通常是无法实现的; 它只是标准库实现设置的上限,字符串的实际大小限制受到其他来源的限制 - 通常是可用RAM的数量.
| 归档时间: |
|
| 查看次数: |
358 次 |
| 最近记录: |