c++ - “最小对齐”和“首选对齐”有什么区别?
问题描述
最近我观察到在 Clang 9.0 上,alignof和__alignof为unsigned long long返回不同的值,并且在https://reviews.llvm.org/D54814上讨论了相同的值:
从 Clang 8.0 和 GCC 8.0 开始,在相同的情况
alignof
下__alignof
返回不同的值。具体来说alignof
,_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。阅读未定义的行为。
推荐阅读
- c - 查看存储在堆栈中的数据
- http-error - 无法处理异常
- excel - 将批量值复制到单元宏时未更新
- docker - 其他电脑无法访问k8s仪表盘
- python - Pandas 和 FastParquet 读取单个分区
- javascript - 如何为谷歌表单的预填链接生成二维码
- google-bigquery - firebase转换的event_params值是什么意思?
- html - 如何在网络上的移动和桌面上设置徽标样式?
- facebook - Facebook:当 Webhook 仅在 Pushlish 模式下运行时,如何证明 publish_pages 正确?
- google-apps-script - 有条件地运行 Google 表格自定义函数