代码之家  ›  专栏  ›  技术社区  ›  jxh

std::array<char,N>的大小是多少?[副本]

  •  12
  • jxh  · 技术社区  · 11 年前

    C++标准说明了什么 sizeof(std::array<char, N>) 应该是(对于某个常量 N )?

    在一个 comment to a different question ,其中提到 std::array 不总是“堆栈分配”。该评论是对另一条评论的回应,该评论猜测 std::数组 声明为局部变量的可能会导致程序由于“堆栈分配”变量的资源不足而中止。我认为后续评论意味着 std::数组 以某种方式切换到动态分配模式。

    我可以想象,可能有某种SFINAE可以应用于触发专用化的数组大小阈值 std::数组 实际上动态分配并管理数组。在这种情况下 sizeof(std::array<...>) 可能只是指针的大小。这是允许发生的吗?

    1 回复  |  直到 8 年前
        1
  •  21
  •   T.C. Yksisarvinen    11 年前

    明显地 sizeof(std::array<char, N>) != N 如果 N == 0 。它也不一定适用于 N > 0 . §23.3.2.1【阵列概述】/p1-2:

    收割台 <array> 定义用于存储固定大小的类模板 对象序列。数组支持随机访问迭代器。一 的实例 array<T, N> 商店 N 类型的元素 T 因此 size() == N 是不变量。存储数组的元素 连续,意味着如果 a 是一个 阵列<T、 N> 然后它服从 身份 &a[n] == &a[0] + n 为所有人 0 <= n < N .

    数组是 可以使用语法初始化的聚合(8.5.1)

    array<T, N> a = { initializer-list };
    

    哪里 initializer-list 是以逗号分隔的列表,最多包含 N 类型可转换为的元素 T .

    §8.5.1[dcl.init.agr]/p1:

    聚合是未提供用户的数组或类(第9条) 构造函数(12.1),没有私有或受保护的非静态数据成员 (第11条),没有基类(第10条),也没有虚拟函数 (10.3).

    自从 array 是聚合类型,它不能有执行动态分配的自定义构造函数,并且必须直接存储元素,因为它必须能够使用聚合初始化从初始值设定项列表中初始化。然而,标准中没有任何内容阻止实现在其C样式数组成员之后添加额外的内容,只要 array<T, N> a = { initializer-list }; 初始值设定项列表 最多包含个 N 成员。一个看起来像

    template<typename T, size_t N>
    struct array {
        //typedefs and member functions omitted
    
        T _Elems[N];
        double _Because_I_can;
    };
    // specialization for N == 0 case omitted
    

    完全合法。因此,不能保证 sizeof(std::array<char, N>) == N .