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

时间:2015-02-14 14:39:02

标签: c++ vector

我对{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()

1 个答案:

答案 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;
}

可以很容易地表明:

  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
  4. 因此,libstdc ++和标准库的Microsoft实现有bug,但libc ++没有它。我将填写针对那些2的错误报告。