在x86中,将单个内存单元设置为零的最快方法是什么?通常我这样做:
C745D800000000 MOV [ebp-28], 0
你可以看到,这种编码方式相当复杂,因为它使用了全部4个字节的常量。如果使用普通的寄存器,我可以使用更紧凑的MVZE
指令,但是MVZE
指令不适用于内存。
我在考虑先清空一个寄存器,然后将寄存器的值MOV
到内存中, 这样虽然需要两条指令,但总长度只有5个字节,比上面那个7个字节的指令更短。遵循"越短就越快"的原则,这可能更可取。
在x86中,将单个内存单元设置为零的最快方法是什么?通常我这样做:
C745D800000000 MOV [ebp-28], 0
你可以看到,这种编码方式相当复杂,因为它使用了全部4个字节的常量。如果使用普通的寄存器,我可以使用更紧凑的MVZE
指令,但是MVZE
指令不适用于内存。
我在考虑先清空一个寄存器,然后将寄存器的值MOV
到内存中, 这样虽然需要两条指令,但总长度只有5个字节,比上面那个7个字节的指令更短。遵循"越短就越快"的原则,这可能更可取。
mov [ebp-28], 0
。请记住,mem, imm
操作数被认为是最慢的之一:如果您分析了代码并发现这是瓶颈,那么请在函数(或其他内容)开头初始化一个寄存器为零,然后在整个代码中使用它作为预定义常量。mov [r14], 0
是一个7字节的指令。 - Björn Lindqvistmov dword [rel label], 0
解码为2个uop指令。因此,在x86-64上的静态数据中,如果您正在针对英特尔CPU进行调整,则首先使用xor
将寄存器清零是纯粹的优势。 - Peter CordesMASKMOVDQU
可能是最快的方式。这使您可以写入一个或多个字节,而不影响周围的字节,并且无需等待请求所有权请求将关联的高速缓存行带入内存。
mov
需要一个imm32
)? - Peter Cordes