为什么 gcc 不能将结构的对齐方式减少到小于其单个字段之一的对齐方式
Why can't gcc reduce the alignment of a struct to be lesser than that of one of its individual fields
我有一个实例化 monica
的结构定义 employee
。结构看起来像这样
struct __attribute__((aligned(2))) employee {
int salary; // 4 bytes
int age; // 4 bytes
} monica;
如您所见,我已将结构的对齐方式强制设置为2
,但gcc 并未将结构的对齐方式设置为2,也没有抛出错误。我尝试使用 alignof
宏(包括 <stdalign.h>
)打印结构的对齐方式,其中 returns 4
作为结构的对齐方式。为什么 gcc 不能将结构的对齐方式设置为小于其字段之一的最大对齐方式的值。
我试图通过在结构中另外添加一个指针作为字段来重现该问题。在将指针添加为字段时,我注意到 gcc 不允许我使用 __attribute__((aligned(x)))
.
将对齐减少到 8 以下
GCC 允许我使用 __attribute__((packed))
将结构的对齐设置为 1
但它仍然不允许我使用 [=21 将对齐设置为 1
=].为什么会这样?
gcc x86 v7.1.1
… When used on a struct, or struct member, the aligned
attribute can only increase the alignment; in order to decrease it, the packed
attribute must be specified as well…
来自 GCC 11.2 文档。您可以查看旧文档。该站点有 7.1 的 none;它从 6.5 跳到 7.5,但我希望在这方面是一样的。
我有一个实例化 monica
的结构定义 employee
。结构看起来像这样
struct __attribute__((aligned(2))) employee {
int salary; // 4 bytes
int age; // 4 bytes
} monica;
如您所见,我已将结构的对齐方式强制设置为2
,但gcc 并未将结构的对齐方式设置为2,也没有抛出错误。我尝试使用 alignof
宏(包括 <stdalign.h>
)打印结构的对齐方式,其中 returns 4
作为结构的对齐方式。为什么 gcc 不能将结构的对齐方式设置为小于其字段之一的最大对齐方式的值。
我试图通过在结构中另外添加一个指针作为字段来重现该问题。在将指针添加为字段时,我注意到 gcc 不允许我使用 __attribute__((aligned(x)))
.
GCC 允许我使用 __attribute__((packed))
将结构的对齐设置为 1
但它仍然不允许我使用 [=21 将对齐设置为 1
=].为什么会这样?
gcc x86 v7.1.1
… When used on a struct, or struct member, the
aligned
attribute can only increase the alignment; in order to decrease it, thepacked
attribute must be specified as well…
来自 GCC 11.2 文档。您可以查看旧文档。该站点有 7.1 的 none;它从 6.5 跳到 7.5,但我希望在这方面是一样的。