You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++标准是否要求std::array<T,0>无尾部填充?主流编译器行为解析

关于std::array<T, 0>的内存优化疑问

C++标准要求std::array即使大小为0也必须是良定义的,因此std::array<T,0>是合法的,尽管原生的int[0]并不被语言标准允许(不过GCC实现了相关扩展)。

但在GCC、Clang和MSVC中,std::array<T,0>并未被当作零大小结构体处理——它不会消除尾部填充,导致[[no_unique_address]]和空基类优化对其完全无效。例如:

#include <array>

struct Tester {
    [[no_unique_address]] std::array<char, 0> arr;
    char c;
};

struct Tester2 : std::array<char, 0> {
    char c;
};

// 在GCC、Clang和MSVC中均成立:
static_assert(sizeof(Tester) == 2);
static_assert(sizeof(Tester2) == 2);

这看起来有点反直觉,因为理论上它完全可以实现为空结构体。那这是C++标准强制要求的吗?

注:我查看了libstdc++的代码,其对std::array<char,0>的实现方式是包含一个未使用[[no_unique_address]]、也未应用空基类优化的空结构体实例,大致如下:

template <typename T>
struct array<T, 0> {
    struct {} empty; // 未使用[[no_unique_address]]!
};

但这并未解释为何要如此设计。尽管[[no_unique_address]]直到C++20才出现,但空基类优化在标准库其他部分被广泛使用,显然如果愿意是可以实现优化的。

编辑补充:我的问题曾被标记为与另一问题重复,但实际上我的问题聚焦于库特性std::array(标准明确其大小为0时合法),而链接问题是关于语言层面的数组特性,二者并不相关。

内容的提问来源于stack exchange,提问作者Bernard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 14:33:20