ich alberte herum und fand, dass die folgendeWarum leal anstelle von inq verwenden?
#include <stdio.h>
void f(int& x){
x+=1;
}
int main(){
int a = 12;
f(a);
printf("%d\n",a);
}
, wenn sie von g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
mit g++ main.cpp -S
erzeugt diese Anordnung (zeigt nur die relevanten Teile) Frage
_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
übersetzt: Warum sollte der Compiler wählen zu verwenden
leal
anstelle von
incq
? Oder fehlt mir etwas?
Bitte schauen Sie sich den optimierten Code an. Und aktualisieren Sie Ihren Beitrag, wenn es Unterschiede gibt. –
Wie würde es 'incq' in diesem Fall verwenden? 'incq' ist unär. Und der Compiler benötigt 'rdx = rax + 1'. Vielleicht ist die eigentliche Frage: Warum hat sie sich dafür entschieden, zwei Register einzubeziehen, in denen eines ausreichen würde (mit "incq")? Ist dieser optimierte Code? Scheinbar nicht. – AnT
'lea' ist auch insofern nützlich, als es keine Flags-Registerwerte beeinflusst, was * sehr * nützlich für den x86 [-64] -Code ist, wo so viele Befehle dies tun. Es ist nur ein besseres Paradigma. 'inc' führte auch andere Probleme wie Partial Flags Register Stalls ein. Die wirkliche Frage ist * warum * würdest du 'inc' anstelle von' lea' hier verwenden? –