机器的最小对齐要求

时间:2017-02-14 13:33:09

标签: c memory-alignment

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

_pure_const_formula_

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

2 个答案:

答案 0 :(得分:5)

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

因此,在这个意义上,union align将与lpdf具有相同的对齐方式(具有最大的对齐要求) )。

例如,如果类型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字节对齐。