gpt4 book ai didi

c++ - 为什么在 32 位 x86 架构上默认对齐 `int64_t` 8 字节?

转载 作者:搜寻专家 更新时间:2023-10-31 02:18:26 25 4
gpt4 key购买 nike

为什么在 32 位 x86 ABI 中 int64_t(例如 long long)的默认对齐方式为 8 字节? 4 字节对齐似乎没问题,因为它只能作为两个 4B 的一半来访问。

最佳答案

有趣的一点:如果你只将它作为两半加载到 32 位 GP 寄存器中,那么 4B 对齐意味着这些操作将以它们的自然对齐方式发生。

但是,如果变量的两半都在同一缓存行中可能是最好的,因为几乎所有访问都会读/写两半。对齐到整个事物的自然对齐方式可以解决这个问题,甚至可以忽略下面的其他原因。


32 位 x86 可以使用 MMX 或 SSE2 movq 在单个 64 位加载中加载 64 位整数。使用 vector 指令处理 64 位加法/减法/移位/和按位 bool 值更有效(单指令),只要您不需要立即常量或 mul 或 div。具有 64b 元素的 vector 指令在 32b 模式下仍然可用。


原子 64 位比较和交换在 32 位模式下也可用(lock CMPXCHG8B m64 就像 64 位模式的 lock CMPXCHG16B m128 一样工作,使用两个隐式寄存器(edx: eax)). IDK 它对跨越缓存行边界有什么样的惩罚。


现代 x86 CPU 基本上不会对未对齐的加载/存储进行惩罚,除非它们跨越高速缓存行边界,这就是为什么我只这么说,而不是说未对齐的 64b 通常是不好的。请参阅 中的链接维基,尤其是Agner Fog 的向导。

关于c++ - 为什么在 32 位 x86 架构上默认对齐 `int64_t` 8 字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34504421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com