首页 > 解决方案 > 为什么 `long double` 需要 16 字节对齐?

问题描述

像 x86-64 这样的 64 位架构的字长为 64 位。在这种情况下,如果内存访问跨越字边界,那么访问数据将需要双倍的时间。所以需要对齐。- 这就是我所知道的。如果我错了,请纠正我。

现在,GCC 使用 16 字节对齐(msvc 至少使用 8 字节对齐),long double其非填充大小为 10 字节。但无论如何,8 字节对齐需要 2 个读取周期,16 字节对齐也是如此。那么为什么要更严格的 16 字节对齐呢?除了我上面提到的之外,对齐的目的是什么?

long double此外,事实上,由于(80 位 x87 扩展 FP)的非填充部分是 10 字节,实际上 4 字节对齐就足够了。在这种情况下,它也可以在 2 个读取周期(4-6 或 8-2)内读取数据。所以,还要解释这个假设哪里出错了。

(在 i386 System V ABI 中实际sizeof(long double)是 12,在 x86-64 System V 中是 16。它们各自alignof()的 4 和 16 的倍数)

标签: x86-64cpu-architecturememory-alignmentabilong-double

解决方案


推荐阅读