为何libc++中std::array<T,0>的大小与对齐遵循T的规格?
关于libc++中
std::array<T, 0>特化实现的疑问 在libc的实现里,std::array<T, 0>的特化版本包含一个const char类型的成员数组__elems_,它的大小等于sizeof(T),对齐规则也完全遵循T的要求。这个成员从代码上看没有被任何逻辑使用,之所以这么设计,核心是为了满足C标准对std::array的对齐要求:
标准明确规定,std::array<T, N>的对齐方式必须与单个T对象的对齐方式保持一致,哪怕是元素数量N=0的情况。如果采用空成员实现(比如libstdc++的做法),部分编译器会给这个空特化类分配默认的弱对齐(通常是1字节),这就违反了标准的对齐要求。
而通过声明一个大小为sizeof(T)、对齐遵循T的const char数组,就能强制编译器为std::array<T, 0>提供符合标准的对齐属性,同时不会引入额外的运行时开销——因为这个成员实际上不会被访问。
对比其他主流STL的实现:
- libstdc++直接使用空成员来实现
std::array<T, 0>特化; - Microsoft STL则采用分情况处理:当
T不可默认构造时用空成员,否则创建一个单元素的T数组。
内容的提问来源于stack exchange,提问作者Daniel Langr
相关产品推荐
相关产品推荐

