首页 > 解决方案 > “最小对齐”和“首选对齐”有什么区别?

问题描述

最近我观察到在 Clang 9.0 上,alignof__alignofunsigned long long返回不同的值,并且在https://reviews.llvm.org/D54814上讨论了相同的值:

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

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

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

标签: c++clangmemory-alignment

解决方案


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

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

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

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


推荐阅读