gpt4 book ai didi

assembly - 在内存位置调用 `add` 是否比在寄存器上调用它然后移动值更快?

转载 作者:行者123 更新时间:2023-12-02 22:12:58 25 4
gpt4 key购买 nike

什么更快:

add DWORD PTR [rbp-0x4],1

 mov    eax,DWORD PTR [rbp-0x4]
add eax,1
mov DWORD PTR [rbp-0x4],eax

我已经看到编译器生成的第二个代码,所以也许在寄存器上调用 add 会快得多?

最佳答案

它们都解码为相同数量的后端微指令,但内存目标 add 在现代 Intel/AMD CPU 上以更少的融合域微指令通过前端获取这些微指令。

在 Intel CPU 上,add [mem], imm 解码为微融合加载+添加和微融合存储地址+存储数据,因此总共 2 个融合域微指令前端。 AMD CPU 始终将内存操作数与 ALU 操作分组在一起,而不将其称为“微融合”,这就是它们一直以来的工作方式。( https://agner.org/optimize/INC instruction vs ADD 1: Does it matter? )。

<小时/>

第一种方法不会将值保留在寄存器中,因此如果表达式的值是,则无法将其用作++a的一部分用过的。仅针对对内存的副作用。

<小时/>

使用 [rbp - 4] 并增加内存中的本地值,这听起来像是未优化/ Debug模式的代码,您不应该查看这些代码优化的代码通常使用[rsp +-constant]来寻址局部变量,并且(除非变量是 volatile )不会只是存储它立即又回到内存中。

Why does clang produce inefficient asm with -O0 (for this simple floating point sum)? - 在 Debug模式下编译,又名-O0(默认)单独编译每个C语句,并将每个变量视为 volatile ,这是完全可怕的。

参见How to remove "noise" from GCC/clang assembly output?了解如何让编译器生成有趣的 asm。编写一个接受参数并返回值的函数,这样它就可以在不优化或将常量传播到 mov eax,constant_result 的情况下执行某些操作>.

关于assembly - 在内存位置调用 `add` 是否比在寄存器上调用它然后移动值更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61377311/

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