为什么 gcc 不能将结构体的对齐方式减少到小于其单个字段之一的对齐方式

Har*_*ngh 1 c memory struct memory-alignment

我有一个employee实例化的结构定义monica。结构看起来像这样

struct __attribute__((aligned(2))) employee {
    int salary; // 4 bytes
    int age; // 4 bytes
} monica;
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我强制将结构对齐,2但 gcc 不会将结构对齐设置为 2,也不会引发错误。我尝试使用alignof宏(include <stdalign.h>)打印结构的对齐方式,该宏4作为结构的对齐方式返回。为什么 gcc 不能将结构的对齐方式设置为小于其字段之一的最大对齐方式的值。

我尝试通过另外添加一个指针作为结构中的字段来重现该问题。在将指针添加为字段时,我注意到 gcc 不允许我使用__attribute__((aligned(x))).

1GCC 允许我通过使用设置结构的对齐方式__attribute__((packed)),但它仍然不允许我1通过使用设置对齐方式__attribute__((aligned(1)))。为什么会发生这种情况?

海湾合作委员会 x86 v7.1.1

Eri*_*hil 5

GCC文档说:

\n
\n

\xe2\x80\xa6 当用于结构体或结构体成员时,该aligned属性只能增加对齐方式;为了减少它,packed还必须指定该属性\xe2\x80\xa6

\n
\n

这是来自 GCC 11.2 文档。您可以查看较旧的文档。该站点上没有 7.1 版本;它从 6.5 跃升至 7.5,但我预计在这方面是一样的。

\n