我打打鬧鬧,發現以下爲什麼使用leal而不是incq?
#include <stdio.h>
void f(int& x){
x+=1;
}
int main(){
int a = 12;
f(a);
printf("%d\n",a);
}
時g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
與g++ main.cpp -S
翻譯產生這個組件(只顯示相關部分)
_Z1fRi:
pushq %rbp
movq %rsp, %rbp
movq %rdi, -8(%rbp)
movq -8(%rbp), %rax
movl (%rax), %eax
leal 1(%rax), %edx
movq -8(%rbp), %rax
movl %edx, (%rax)
popq %rbp
ret
main:
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp
movl $12, -4(%rbp)
leaq -4(%rbp), %rax
movq %rax, %rdi
call _Z1fRi
movl -4(%rbp), %eax
movl %eax, %esi
movl $.LC0, %edi
movl $0, %eax
call printf
movl $0, %eax
leave
ret
問:爲什麼編譯器選擇使用leal
而不是incq
?或者我錯過了什麼?
請看優化代碼。如果有差異,請更新您的帖子。 –
在這種情況下,它如何使用'incq'? 'incq'是一元的。編譯器需要'rdx = rax + 1'。也許真正的問題是:爲什麼它選擇包含兩個寄存器,其中一個就足夠了(使用'incq')?這是優化的代碼?顯然不是。 – AnT
'lea'也是有用的,因爲它不會影響任何標誌寄存器值,這對於x86 [-64]代碼非常有用,在那裏有很多指令。這只是一個更好的範例。 inc還介紹了其他問題,例如部分標誌寄存器攤位。真正的問題是*爲什麼*你會在這裏使用'inc'而不是'lea'? –