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/