机器的最低对齐要求

Minimum Alignment Requirements for a Machine

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

union align {
    long l;
    char *p;
    double d;
    int (*f) (void);
};

有人可以解释一下 'strictest alignment requirements' 是什么意思吗?它是如何在主机上给出最小对齐的?

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

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

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

我不太确定标准是否保证这 4 种类型的最大对齐要求是 "minimum alignment on the host machine"。为了理解编译器在存储管理方面的工作方式,这可能只是一个很好的练习。

考虑一台机器,由于内存总线的限制,它只能从偶数地址读取 16 位值。

这样的机器上的 16 位值的 "alignment requirement" 为 2。

不要不要依赖union诡计。从 C11 开始,有:

  • max_align_t 是平台 (1) 的最大(标准)标量类型的同义词,即具有由 malloc().
  • 提供的对齐方式的类型
  • _Alignof,它给出了给定类型的对齐要求。
  • alignas,允许修改类型的对齐方式。

(1):最大的此类类型 通常 long double,您书中的示例中可疑地缺少这种类型...

请注意,编译器可能支持需要特殊处理的 "extension" 类型。例如,具有 256 字节的 SSE 数据类型,但具有 malloc() "only" 进行 128 字节对齐。