saa*_*ame 1 c memory-alignment
我正在读一本关于编译器设计和实现的书.在关于存储管理的部分中,作者编写了一个分配内存的函数.他希望函数适合任何类型.他声称下面的联合大小是主机上的最小对齐.我不太明白这意味着什么.从书中可以看出:"......它的领域最有可能具有最严格的对齐要求."
union align {
long l;
char *p;
double d;
int (*f) (void);
};
Run Code Online (Sandbox Code Playgroud)
有人可以解释什么是"最严格的对齐要求"意味着什么?它如何在主机上实现最小的对齐?
选择对齐的对齐方式与具有最大对齐要求的成员的对齐方式相同.它的大小选择与最大成员一样大,加上一些额外的填充,以确保在数组中按顺序排列时对齐不会中断.
所以在这个意义上说,union align
将有相同的对齐方式要么l
,p
,d
或f
(两者具有最大的对齐要求).
例如,如果f
类型的成员int (*)(void)
具有对齐要求8
,则整个并集将在8字节边界上对齐,即使long
仅需要4
.
我不太确定该标准是否保证这4种类型中最大的对齐要求是"主机上的最小对齐".为了理解编译器在存储管理方面的工作方式,这可能只是一个很好的练习.