c++ - std::vector<char> 的 max_size() 是否有错误?

标签 c++ vector

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

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

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

因此,该类型不能存储2n − 1,而最多只能存储2n − 1 − 1. 如果您查看您的std::vector实现时,您会清楚地看到大小会产生 2 个指针的差异(在将其转换为无符号整数之前)。

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

最佳答案

这显然是一些标准库实现中的错误。我在该主题上做了更多工作,并使用以下代码

#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++ 和标准库的微软实现都有 bug,而 libc++ 没有。我将针对这 2 个问题填写错误报告。

关于c++ - std::vector<char> 的 max_size() 是否有错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28516686/

相关文章:

c++ - 函数组合运算符

c++ - 在 C++ 中更改结构内部元素的方法?

c++ - std::vector<std::vector<T>> 的迭代器有效性

c++ - Push_back 不起作用

C# 如何将点转换为 vector2?

c++ - 我正在尝试创建一个类 vector ,然后用 for 循环命名每个类

c++ - 如何在 C++ 中返回空迭代器?

c++ - 如何在 C++ 中简化多个 if-else-if 语句

c++ - clang:强制循环展开特定循环

c++ - 在一个循环中对 2 个 vector 进行操作的问题