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返回首选对齐方式。
我了解类型对齐,但从未遇到过“最小对齐”和“首选对齐”。
有人可以帮我理解这些到底是什么以及有什么区别吗?谢谢。
最小对齐(在给定平台上)是不会崩溃的对齐。在 x86-64 上它是一个字节。在PowerPC、Sparc或RISC-V上,它可能是 4 或 8 个字节。
首选对齐方式是通常的对齐方式,例如由于处理器总线或 CPU 高速缓存而导致的对齐方式。在 x86-64 上,unsigned long long它可能是 8 个字节。任何不太对齐的访问都会造成性能损失。
详细信息是特定于目标处理器和ABI 的(例如,请参阅此)。想想交叉编译器。
C 或 C++的语义没有完美定义,也没有完全形式化。查看 C++标准草案:它是用英语编写的,没有正式化。但另请参阅Frama-C (它有一个用于 C++ 的实验性前端)和CompCert。阅读有关未定义行为的信息。