Ich habe diese beiden Compiler in verschiedenen Projekten verwendet.Unterschied zwischen clang und gcc
Wie unterscheiden sie sich hinsichtlich Codeverarbeitung und Ausgabegenerationen? Zum Beispiel haben sowohl gcc
als auch clang
-O2
Optionen für die Optimierung. Arbeiten sie in Bezug auf die Code-Optimierung auf die gleiche Weise (High-Level)? Ich habe einen kleinen Test, zum Beispiel, wenn ich den folgenden Code haben:
int foo(int num) {
if(num % 2 == 1)
return num * num;
else
return num * num +1;
}
die folgenden sind die Ausgabebaugruppen mit Klappern und gcc mit -O2:
----gcc 5.3.0----- ----clang 3.8.0----
foo(int): foo(int):
movl %edi, %edx movl %edi, %eax
shrl $31, %edx shrl $31, %eax
leal (%rdi,%rdx), %eax addl %edi, %eax
andl $1, %eax andl $-2, %eax
subl %edx, %eax movl %edi, %ecx
cmpl $1, %eax subl %eax, %ecx
je .L5 imull %edi, %edi
imull %edi, %edi cmpl $1, %ecx
leal 1(%rdi), %eax setne %al
ret movzbl %al, %eax
.L5: addl %edi, %eax
movl %edi, %eax retq
imull %edi, %eax
ret
wie es die Ausgabe zu sehen ist hat andere Anweisungen. Also meine Frage ist, hat einer von ihnen Vorteile gegenüber anderen in verschiedenen Projekten?
Sie könnten Ihren Code verbessern, indem Sie stattdessen 'int foo (int num) {Rückkehrnummer * num + ~ num & 1;}' schreiben. – fuz
@FUZxxl: toller Punkt, dass [macht viel besseren Code] (https://godbolt.org/g/Y1RZuj), aber Sie brauchen Parens 'int foo (int num) {zurück Nummer * num + (~ num & 1);} 'weil' & 'eine niedrigere Priorität als * und + hat. Das hat auch ein anderes Verhalten für negative Zahlen. In C ist' -1% 2' '-1', also ist das if falsch. Der Code von gcc ist dafür verantwortlich wenn Sie 'n * n + (n% 2)' schreiben. –
@FUZxxl danke für den Hinweis, es ist nur ein einfacher Test zu sehen, welche Compiler was ausgeben – Pooya