“最小对齐”和“首选对齐”有什么区别?

Pen*_*ala 5 c++ clang memory-alignment

最近我观察到,在 Clang 9.0 上,alignof__alignof返回unsigned long long的不同值,并且在https://reviews.llvm.org/D54814上也讨论了同样的问题:

从 Clang 8.0 和 GCC 8.0 开始,在相同情况下返回不同的值alignof__alignof具体而言alignof,and_Alignof返回类型的最小对齐方式,其中 as__alignof返回首选对齐方式。

我了解类型对齐,但​​从未遇到过“最小对齐”和“首选对齐”。

有人可以帮我理解这些到底是什么以及有什么区别吗?谢谢。

Bas*_*tch 1

最小对齐(在给定平台上)是不会崩溃的对齐。在 x86-64 上它是一个字节。在PowerPCSparcRISC-V上,它可能是 4 或 8 个字节。

首选对齐方式是通常的对齐方式,例如由于处理器总线或 CPU 高速缓存而导致的对齐方式。在 x86-64 上,unsigned long long它可能是 8 个字节。任何不太对齐的访问都会造成性能损失。

详细信息是特定于目标处理器和ABI 的(例如,请参阅)。想想交叉编译器

C 或 C++的语义没有完美定义,也没有完全形式化。查看 C++标准草案:它是用英语编写的,没有正式化。但另请参阅Frama-C (它有一个用于 C++ 的实验性前端)和CompCert。阅读有关未定义行为的信息。

  • 我不喜欢你的定义。除了“sizeof”为 1 的东西之外,我从未见过“allignof”值为“1”。 (4认同)