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
相关产品推荐
相关产品推荐

