Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::vector的max_size()是否为<;char>;你有臭虫吗?_C++_Vector - Fatal编程技术网

C++ std::vector的max_size()是否为<;char>;你有臭虫吗?

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.如果

我对我测试的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
实现,您将清楚地看到大小会产生两个指针的差异(在将其转换为无符号整数之前)


那么,为什么他们可以假装存储超过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。