我正在读一本关于编译器设计和实现的书。在关于存储管理的部分中,作者编写了一个分配内存的函数。他希望函数适合任何类型。他声称下面的联合大小是主机上的最小对齐。我不太明白这意味着什么。从书中可以看出:" ......它的字段是最有可能具有最严格对齐要求的字段。"
_pure_const_formula_
有人可以解释什么是最严格的对齐要求'意味着如何在主机上实现最小对齐?
答案 0 :(得分:5)
选择对齐的对齐方式与具有最大对齐要求的成员的对齐方式相同。它的大小选择与最大的成员一样大,加上一些额外的填充,以确保在阵列中按顺序排列时对齐不会中断。
因此,在这个意义上,union align
将与l
,p
,d
或f
具有相同的对齐方式(具有最大的对齐要求) )。
例如,如果类型f
的{{1}}成员的对齐要求为int (*)(void)
,则整个联合将在8字节边界上对齐,即使{ {1}}仅需8
。
我不太确定该标准是否保证这4种类型中最大的对齐要求将是主机上的最小对齐"。为了理解编译器在存储管理方面的工作方式,这可能只是一个很好的练习。
答案 1 :(得分:4)
考虑一台机器,由于存储器总线的限制,它只能从偶数地址读取16位值。
这种机器上的16位值的“对齐要求”为2。
不依赖于union
欺骗。自C11以来,有:
max_align_t
,它与平台(1)的最大(标准)标量类型同义,即malloc()
提供对齐的类型。_Alignof
,它给出了给定类型的对齐要求。alignas
,允许修改类型的对齐方式。(1):最大的此类型通常为long double
,这种类型在您的图书示例中可疑地缺席...
请注意,编译器可能支持需要特殊处理的“扩展”类型。例如,具有256字节的SSE数据类型,但malloc()
“仅”执行128字节对齐。