与 std::aligned_storage 过度对齐的类型
Over-aligned types with std::aligned_storage
关于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
的格式将不正确。
相关文章:
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 具有调整对齐方式的类型定义
- 外部基础类型未按请求对齐时的atomic_ref
- 如何分配适合容纳 T 类型对象的缓冲区(可能过度对齐、可能有运算符 new 等)
- 对象地址是否保证是其类型对齐的倍数
- 对齐C++字符串类型问题 std::字符串到 TStr
- 数据对齐:限制内存地址为数据类型大小倍数的原因
- 与 std::aligned_storage 过度对齐的类型
- 在英特尔上自然对齐的POD类型的保证原子操作
- 更改派生类型的对齐
- 幻影类型是否与原始类型具有相同的对齐方式
- 对齐说明符:在类型 / 上 成员数据
- 如何检查该类型的类型指针是正确对齐的
- 类型是否可以具有除'n-byte alignment'以外的对齐要求
- 与包含的类型相比,数组在C++中的对齐方式如何?2.
- 新字符是否实际上保证类类型的对齐内存
- 我不明白在下面的代码中将 char buffer[] 与 X 类型的对象对齐的原因
- 标准是否要求自动存储中的对象对任何类型都具有正确的对齐方式(例如malloc)
- 基本类型和结构的对齐,内部只有这个基本类型
- 抛出对齐类型时出现 Clang 运行时错误.编译器错误