为什么gcc警告大对齐值?

时间:2018-01-03 02:20:25

标签: c++ c++14

使用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没有这样的错误。

Example

  1. 这是否意味着编译器只是告知对齐太大?这种警告的目的是什么?
  2. 标准不允许编译器忽略此对齐说明符(即使存在警告),是吗?

1 个答案:

答案 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-expressionstd::allocator::allocatestd::get_temporary_buffer支持过度对齐类型,则它是实现定义的。使用过度对齐类型实例化的分配器允许在编译时无法实例化,在运行时抛出std::bad_alloc,无声地忽略不支持的对齐要求,或者正确处理它们。

基本上,你可以声明高度对齐的类型,但是当你使用它们时,某些东西可能会破坏; GCC6可能是保守的,或者它可能实际上在上面提到的一些指定案例中失败了,并且它试图警告你。