使用gcc 6.3编译时,此示例程序
#include <array>
class alignas(4096) A {
std::array<int, 256> array;
};
int main()
{
A a;
}
发出以下警告:
3 : <source>:3:21: warning: requested alignment 4096 is larger than 128 [-Wattributes]
class alignas(4096) A {
^
虽然gcc 7.2没有这样的错误。
答案 0 :(得分:3)
该标准允许all sorts of things to break if you alignas
to larger than that of std::max_align_t
:
任何类型的最大基本对齐是
std::max_align_t
的对齐方式。如果使用std::max_align_t
使类型的对齐比alignas
更严格(更大),则将其称为具有扩展对齐要求的类型。对齐扩展的类型或非静态数据成员具有扩展对齐的类类型是过度对齐类型。如果new-expression
,std::allocator::allocate
和std::get_temporary_buffer
支持过度对齐类型,则它是实现定义的。使用过度对齐类型实例化的分配器允许在编译时无法实例化,在运行时抛出std::bad_alloc
,无声地忽略不支持的对齐要求,或者正确处理它们。
基本上,你可以声明高度对齐的类型,但是当你使用它们时,某些东西可能会破坏; GCC6可能是保守的,或者它可能实际上在上面提到的一些指定案例中失败了,并且它试图警告你。