Optimization 在x86中,与16字节边界对齐意味着什么

Optimization 在x86中,与16字节边界对齐意味着什么,optimization,x86,memory-alignment,Optimization,X86,Memory Alignment,有一章介绍从MMX命令到SSE的转换,其中说明了休耕状态: 使用可能未与16字节边界对齐的内存操作数的计算指令必须替换为未对齐的128位加载(MOVDQU),后跟使用寄存器操作数的相同计算操作 (第5.8章从64位到128位SIMD整数的转换,第5-43页) 我不明白他们所说的“可能不与16字节边界对齐”是什么意思,你能澄清一下并给出一些例子吗?在16字节边界对齐的数据将有一个偶数的内存地址-严格地说,是2的倍数。每个字节是8位,所以要在16字节边界上对齐,您需要对齐到每组两个字节 类似地,在3

有一章介绍从MMX命令到SSE的转换,其中说明了休耕状态:

使用可能未与16字节边界对齐的内存操作数的计算指令必须替换为未对齐的128位加载(MOVDQU),后跟使用寄存器操作数的相同计算操作

(第5.8章从64位到128位SIMD整数的转换,第5-43页)


我不明白他们所说的“可能不与16字节边界对齐”是什么意思,你能澄清一下并给出一些例子吗?

在16字节边界对齐的数据将有一个偶数的内存地址-严格地说,是2的倍数。每个字节是8位,所以要在16字节边界上对齐,您需要对齐到每组两个字节

类似地,在32位(4字节)边界上对齐的内存将具有四的倍数的内存地址,因为您将四个字节组合在一起形成一个32位字。

对多个数据执行相同指令的某些指令要求将此数据的内存地址对齐到某个字节边界。这实际上意味着数据所在的内存地址需要可以被指令所需的字节数整除

因此,在您的情况下,对齐是16字节(128位),这意味着数据的内存地址需要是16的倍数。例如,0x00010将是16字节对齐的,而0x00011将不是


如何使数据对齐取决于您使用的编程语言(有时是编译器)。大多数具有内存地址概念的语言也会为您提供指定对齐方式的方法

我在这里猜测,但可能是“可能未对齐到16字节边界”意味着此内存位置以前出于某些其他目的已对齐到较小的值(4或8字节),现在要在此内存上执行SSE指令,您需要显式将其加载到寄存器中吗?

当他们说“可能未对齐”时,它们意味着当与未对齐的指针一起使用时,代码是否需要正确工作。i、 e.你不能假设输入总是一致的。(雅各布的回答涵盖了地址对齐的含义)。