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

Does max_size() of std::vector<char> have a bug?

本文关键字:lt char 有错误 gt vector max size std      更新时间:2023-10-16

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

据我所知,std::vector<T>的每个实现都有三个类型为T*的成员:begin_end_capacity_

CCD_ 7指向矢量的第一个值,CCD_。因此,向量的大小由end_ - begin_给出。但这种差异的结果是std::ptrdiff_t类型,它是我所知的每个实现中n位的有符号整数。

因此,这种类型不能存储2n−1,但仅高达2n−1&减号;1.如果您查看std::vector实现,您会清楚地看到大小会产生2个指针的差异(在将其强制转换为无符号整数之前)。

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

可以很容易地证明:

  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实现有这个错误,但libc++没有。

  • Gcc。报告为错误65131。它被拒绝了,因为ABI说,对于所有32位ABI,你不能分配超过一半的地址空间。此问题以前已在此处解决:https://gcc.gnu.org/ml/gcc/2011-08/msg00221.html