C++ std::vector的max_size()是否为<;char>;你有臭虫吗?
我对我测试的n=32和n=64位系统上的C++ std::vector的max_size()是否为<;char>;你有臭虫吗?,c++,vector,C++,Vector,我对我测试的n=32和n=64位系统上的std::vector::max_size()的结果感到困惑。结果是2n− 1.让我解释一下我为什么感到困惑 我所知道的std::vector的每个实现都有三个类型的成员T*:开始,结束,容量 开始指向向量的第一个值,结束指向最后一个值之后的值。 因此,向量的大小由end\u-begin\u给出。但这种差异的结果是std::ptrdiff_t类型,这是我所知道的每个实现中n位的有符号整数 因此,这种类型不能存储2n− 1,但最多只有2n− 1.− 1.如果
std::vector::max_size()
的结果感到困惑。结果是2n− 1.让我解释一下我为什么感到困惑
我所知道的std::vector
的每个实现都有三个类型的成员T*
:开始
,结束
,容量
开始
指向向量的第一个值,结束
指向最后一个值之后的值。
因此,向量的大小由end\u-begin\u
给出。但这种差异的结果是std::ptrdiff_t类型,这是我所知道的每个实现中n位的有符号整数
因此,这种类型不能存储2n− 1,但最多只有2n− 1.− 1.如果查看std::vector
实现,您将清楚地看到大小会产生两个指针的差异(在将其转换为无符号整数之前)
那么,为什么他们可以假装存储超过2n个呢− 1不破坏
.size()
?的元素在一些标准库实现中显然是一个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;
}
#包括
#包括
#包括
int main(){
自动v=std::vector();
std::难道这没用吗,不用麻烦了。要在64位操作系统上分配接近2^n-1个字节,还需要很长时间。汉斯:它在32位系统上可能有用。我承认,在非常罕见的情况下,它是“没用的”不是标准的一部分,我仍然在想。很可能任何普通的编译器都会为(size\u t)(end\u-begin\u)给出正确的结果当减法不符合 PrDeFifft,即使它在技术上是未定义的。标准库实现可能假设使用了这样的编译器。我猜想,有些C++用户非常自豪地使用无符号整数来进行数组索引(对我来说,STL的一大缺陷)。他们甚至没有意识到他们的实现使用的是一个有符号整数std::ptrdiff_t,因此Bogdan:Bjarne Stroustrup、Herb Sutter和Chandler Carruth两种类型的整数都有不好的一面,他们认识到在STL中使用std::size_t的错误.在这里,42:38和1:02:50。