最近我观察到,在 Clang 9.0 上 alignof 和 __alignof 为 unsigned long long 返回不同的值,并且在 https://reviews.llvm.org/D54814 处对此进行了讨论:
Starting in Clang 8.0 and GCC 8.0,
alignof
and__alignof
return different values in same cases. Specificallyalignof
and_Alignof
return the minimum alignment for a type, where as__alignof
returns the preferred alignment.
我了解类型对齐,但从未遇到过“最小对齐”和“首选对齐”。
有人可以帮我理解这些到底是什么以及有什么区别吗?谢谢。
请您参考如下方法:
最小对齐是(在给定平台上)不会崩溃的对齐。在 x86-64 上它是一个字节。上PowerPC或Sparc或RISC-V它可能是 4 或 8 个字节。
首选对齐方式是通常的对齐方式,例如由于处理器总线或 CPU 缓存。在 x86-64 上,unsigned long long
可能是 8 个字节。任何不太一致的访问都会造成性能损失。
详细信息是目标处理器和 ABI具体(例如,参见 this )。想想cross-compilers .
semantics C 或 C++ 的定义并不完美,也没有完全形式化。查看 C++ 草案 standard : 这是用英文写的,没有正式化。但另请参阅Frama-C (它有一个 C++ 实验性前端)和 CompCert 。了解 undefined behavior .