首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >max_size()的std::vector.char>是否有bug?

max_size()的std::vector.char>是否有bug?
EN

Stack Overflow用户
提问于 2018-04-04 00:56:47
回答 1查看 0关注 0票数 0

对我测试过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()呢?

EN

回答 1

Stack Overflow用户

发布于 2018-04-04 10:29:55

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

代码语言:txt
复制
#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,max使用的libstdc++中_size()返回size_MAX
  3. 在VisualStudio 2013实现中,最大_size()返回size_MAX

因此,libstdc++和Microsoft实现的标准库都有错误,而libc++却没有。我会根据这2条填写一份错误报告。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档