std::vector 的 max_size()<char> 有错误吗?
Does max_size() of std::vector<char> have a bug?
我对我测试的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;
}
可以很容易地证明:
- 在libc++中,clang使用,max_size()返回PTRDIFF_max
- 在gcc 4.9.2使用的libstdc++中,max_size()返回size_max
- 在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