对我测试过std::vector< char >::max_size()
的n = 32和n = 64位系统的结果感到困惑。结果是2 n - 1。让我解释我为什么感到困惑。
每执行std::vector<T>
,我知道有一个类型的三个成员T*
:begin_
,end_
,capacity_
。
begin_
指向矢量的第一个值并end_
指向最后一个值。因此,矢量的大小由下式给出end_ - begin_
。但是这种差异的结果是在我知道的每个实现上都是n位的std::ptrdiff_t
有符号整数。
因此,这种类型不能存储2 ñ - 1,但仅达2 ñ - 1 - 1。如果你看看你std::vector
实现,你会清楚地看到,尺寸使得它转换成一无符号之前的2个指针(差别整数)。
那么,他们怎么能假装存储超过2 n - 1个元素而不会破坏.size()
呢?
发布于 2018-04-04 10:29:55
显然,它是一些标准库实现中的一个bug。我已经在这个主题上做了更多的工作,并使用以下代码
#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实现的标准库都有错误,而libc++却没有。我会根据这2条填写一份错误报告。
https://stackoverflow.com/questions/-100007954
复制相似问题