std :: vector <char>的max_size()有错误吗?

Ins*_*oop 18 c++ vector

std::vector< char >::max_size()n = 32和n = 64位系统的测试结果感到困惑.结果是2 n - 1.让我解释为什么我感到困惑.

每执行std::vector<T>,我知道有一个类型的三个成员T*:begin_,end_,capacity_.

begin_指向向量的第一个值并end_指向最后一个向量的值.因此,矢量的大小由下式给出end_ - begin_.但是这种差异的结果是在我知道的每个实现上都是nstd::ptrdiff_t有符号整数的类型.

因此,这种类型不能存储2 ñ - 1,但仅达2 ñ - 1 - 1.如果你看看你std::vector实现,你会清楚地看到,尺寸使得它转换成一无符号之前的2个指针(差别整数).

那么,为什么他们可以假装存储超过2 n -1个元素而不会破坏.size()

Ins*_*oop 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;
}
Run Code Online (Sandbox Code Playgroud)

一个人可以很容易地表明:

  1. 在libc ++中,由clang使用,max_size()返回PTRDIFF_MAX
  2. 在gcc 4.9.2使用的libstdc ++中,max_size()返回SIZE_MAX
  3. 在Visual Studio 2013实现中,max_size()返回SIZE_MAX

因此,libstdc ++和标准库的Microsoft实现有bug,但libc ++没有它.我将填写针对那些2的错误报告.