与 std::aligned_storage 过度对齐的类型

Over-aligned types with std::aligned_storage

本文关键字:对齐 类型 storage std aligned      更新时间:2023-10-16

关于std::aligned_storage模板,C++标准声明

对于某些类型T默认对齐Align应等于alignof(T)

这是否意味着程序中必须有这样的类型,或者必须有可能制作这样的类型?特别是,在cpp首选项上建议的可能实现是

template<std::size_t Len, std::size_t Align /* default alignment not implemented */>
struct aligned_storage {
typedef struct {
alignas(Align) unsigned char data[Len];
} type;
};

如果可能的话,这似乎会使类型具有该对齐方式(也就是说,如果Align是有效的对齐方式)。该行为是必需的,还是指定Align(如果此类类型尚不存在)的未定义行为?

而且,也许更重要的是,在实践中,编译器或标准库在这种情况下无法做正确的事情,假设Align至少是类型具有的法律一致性,这是否合理?

您可以随时尝试使类型具有任意(有效)对齐方式N

template <std::size_t N> struct X { alignas(N) char c; };

N大于默认对齐方式时,X具有扩展对齐方式。对扩展对齐的支持是实现定义的,[dcl.align] 说:

如果常量表达式的计算结果未达到对齐值 (6.11),或者计算结果为扩展值 对齐和实现不支持该对齐 在声明的上下文中,程序格式不正确。

因此,当您尝试对不支持的扩展对齐方式说X<N>时,您将面临诊断。您现在可以使用X<N>的存在(或其他方式)来证明专业化aligned_storage<Len, N>的有效性(其条件现在满足T = X<N>)。

由于aligned_storage将在内部有效地使用类似X的东西,因此您甚至不必实际定义X。这只是解释中的心理辅助。如果请求的对齐方式不受支持,则aligned_storage的格式将不正确。