使用std :: aligned_storage的过度对齐类型

时间:2017-03-28 18:46:09

标签: c++ c++11 memory-alignment

关于std::aligned_storage模板,C ++标准规定了

  对于某些类型Align默认对齐,

alignof(T)应等于T

这是否意味着程序中必须存在这样的类型,或者必须能够制作这样的类型?特别是,cppreference上建议的possible implementation

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至少是一个类型的合法对齐?

1 个答案:

答案 0 :(得分:2)

您始终可以尝试使用任意(有效)对齐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将会格式不正确。