【发布时间】:2019-02-05 14:19:52
【问题描述】:
我在看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?
总的来说,我想知道,出于什么原因,实现不会使用所有空间?
【问题讨论】:
-
依赖于实现,你试过不同的编译器和标准库吗?
-
我猜想这与 (1)
std::string允许 NUL 字符和 (2)size()必须是 O(1) 因此长度必须成为其有效负载的一部分,对于具有最大理论长度的字符串将占用 4 个字节。或者,它可能是用于短字符串优化的指针。 -
然后铿锵回答
18446744073709551599。所以问问不同的标准库实现者。你会得到更好的答案。 -
@Ayxan 实际上我不同意这个答案。限制不是由架构强加的,而是由库实现强加的。有时
std::string::max_size()会超出可用内存,而在某些架构上,您的可用内存很可能超过max_size给出的限制。 -
@user463035818 好的,那你是对的。感谢您纠正我,但我不得不说像“The size of a string is only limited by the amount of memory available to the program, it is more of a operating system limitation than a C++ limitation”这样的陈述确实非常具有误导性。
标签: c++