libstdc ++的max_align_t定义中的属性

时间:2013-11-21 08:24:53

标签: c++ gcc c++11 alignment libstdc++

max_align_t在libstdc ++中定义如下:

typedef struct {
  long long __max_align_ll __attribute__((__aligned__(__alignof__(long long))));
  long double __max_align_ld __attribute__((__aligned__(__alignof__(long double))));
} max_align_t;

这些属性不是多余的吗?没有这些属性我得到了相同的结果:

typedef struct {
  long long __max_align_ll;
  long double __max_align_ld;
} max_align_t;

问题是'这些属性是否有任何原因?'

1 个答案:

答案 0 :(得分:2)

如果属性作为另一个结构的成员包含并使用-fpack-struct或打包#pragma

进行编译,则属性会强制该类型正确对齐

e.g。

typedef struct {
  long long __max_align_ll __attribute__((__aligned__(__alignof__(long long))));
  long double __max_align_ld __attribute__((__aligned__(__alignof__(long double))));
} max_align_t;

typedef struct {
  long long __max_align_ll;
  long double __max_align_ld;
} max_align2_t;

struct A {
  char c;
  max_align_t ma;
};

struct A2 {
  char c;
  max_align2_t ma;
};

static_assert( sizeof(A) == sizeof(A2), "" );

使用-fpack-struct断言失败,表明属性会阻止max_align_t类型错误对齐。