私は質問浮気とg++ main.cpp -S
でg++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
によって翻訳された以下のなぜincqの代わりにlealを使用するのですか?
#include <stdio.h>
void f(int& x){
x+=1;
}
int main(){
int a = 12;
f(a);
printf("%d\n",a);
}
が(関連部分のみを示す)は、このアセンブリを生産することを見出した
_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
た:なぜコンパイラが選ぶだろうincq
の代わりにleal
を使用しますか?または私は何かを逃していますか?
最適化されたコードをご覧ください。違いがある場合は、あなたの投稿を更新してください。 –
この場合、 'incq'はどのように使用されますか? 'incq'は単項式です。コンパイラには 'rdx = rax + 1'が必要です。おそらく本当の問題は、(incqで)十分なところに2つのレジスタを含めることを選択した理由は?この最適化されたコードですか?どうやらない。 – AnT
'lea'はフラグレジスタの値に影響を与えない点でも便利です。これは非常に多くの指示があるx86 [-64]コードにとっては非常に便利です。それはもっと良いパラダイムです。 'inc'は、部分フラグレジスタの停止のような他の問題も導入しました。本当の疑問は、なぜここで 'lea'の代わりに' inc'を使うのですか? –