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

关于c++ - libstdc++的max_align_t定义中的属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20115772/

10-11 22:38
查看更多