libstdc++的max_aligntt定义中的属性

attributes in the definition of max_align_t of libstdc++

本文关键字:属性 定义 max libstdc++ aligntt      更新时间:2023-10-16

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;

问题是"指定这些属性有什么原因吗?"

如果类型作为另一个结构的成员包含并使用-fpack-struct或打包#pragma 进行编译,则属性会强制该类型正确对齐

例如

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类型被错误对齐。