机器的最小对齐要求

saa*_*ame 1 c memory-alignment

我正在读一本关于编译器设计和实现的书.在关于存储管理的部分中,作者编写了一个分配内存的函数.他希望函数适合任何类型.他声称下面的联合大小是主机上的最小对齐.我不太明白这意味着什么.从书中可以看出:"......它的领域最有可能具有最严格的对齐要求."

union align {
    long l;
    char *p;
    double d;
    int (*f) (void);
};
Run Code Online (Sandbox Code Playgroud)

有人可以解释什么是"最严格的对齐要求"意味着什么?它如何在主机上实现最小的对齐?

Bla*_*iev 5

选择对齐的对齐方式与具有最大对齐要求的成员的对齐方式相同.它的大小选择与最大成员一样大,加上一些额外的填充,以确保在数组中按顺序排列时对齐不会中断.

所以在这个意义上说,union align将有相同的对齐方式要么l,p,df(两者具有最大的对齐要求).

例如,如果f类型的成员int (*)(void)具有对齐要求8,则整个并集将在8字节边界上对齐,即使long仅需要4.

我不太确定该标准是否保证这4种类型中最大的对齐要求是"主机上的最小对齐".为了理解编译器在存储管理方面的工作方式,这可能只是一个很好的练习.