我std::vector< char >::max_size()对n = 32和n = 64位系统的测试结果感到困惑.结果是2 n - 1.让我解释为什么我感到困惑.
每执行std::vector<T>,我知道有一个类型的三个成员T*:begin_,end_,capacity_.
begin_指向向量的第一个值并end_指向最后一个向量的值.因此,矢量的大小由下式给出end_ - begin_.但是这种差异的结果是在我知道的每个实现上都是n位std::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)
一个人可以很容易地表明:
因此,libstdc ++和标准库的Microsoft实现有bug,但libc ++没有它.我将填写针对那些2的错误报告.
| 归档时间: |
|
| 查看次数: |
470 次 |
| 最近记录: |