我对{i> n = 32和 n = 64位系统std::vector< char >::max_size()
的结果感到困惑。结果是2 n - 1.让我解释为什么我感到困惑。
我所知道的std::vector<T>
的每个实施都有三个T*
类型的成员:begin_
,end_
,capacity_
。
begin_
指向向量的第一个值,end_
指向最后一个值。
因此,向量的大小由end_ - begin_
给出。但是这种差异的结果是std::ptrdiff_t
类型,它是我知道的每个实现上的有符号整数 n 位。
因此,此类型不能存储2 n - 1,但最多只能存储2 n - 1 - 1.如果你看一下你的std::vector
实现,你会清楚地看到大小会产生2个指针的差异(在将它转换为无符号整数之前)。
那么,为什么他们可以假装存储超过2个 n - 1 元素而不会破坏.size()
?
答案 0 :(得分:10)
这显然是某些标准库实现中的错误。我已就该主题做了更多工作,并使用以下代码
#include <iostream>
#include <climits>
#include <vector>
int main() {
auto v = std::vector<char>();
std::cout << "Maximum size of a std::vector<char>: " <<
v.max_size() << std::endl;
std::cout << "Maximum value a std::size_t can hold: " <<
SIZE_MAX << std::endl;
std::cout << "Maximum value a std::ptrdiff_t can hold: " <<
PTRDIFF_MAX << std::endl;
return 0;
}
可以很容易地表明:
因此,libstdc ++和标准库的Microsoft实现有bug,但libc ++没有它。我将填写针对那些2的错误报告。