Es gibt einen merkwürdigen Unterschied zwischen Assemblies eines kleinen Programms, wenn es als C-Programm oder als C++ - Programm kompiliert wird (für Linux x86-64)).Unterschiede in der Initialisierung des EAX-Registers beim Aufruf einer Funktion in C und C++
Der Code in Frage:
int fun();
int main(){
return fun();
}
es als C-Programm kompiliert (mit gcc -O2
) ergibt:
main:
xorl %eax, %eax
jmp fun
Aber es als C++ kompiliert - Programm (mit g++ -02
) ergibt:
main:
jmp _Z3funv
Ich finde es verwirrend, dass die C-Version den Rückgabewert initialisiert e der Hauptfunktion mit 0
(xorl %eax, %eax
).
Welche Eigenschaft der C-Sprache ist für diese Notwendigkeit verantwortlich?
Edit: Es ist wahr, dass für int fun(void);
die Initialisierung des eax-Registers ist.
Wenn es kein Prototyp fun
überhaupt ist, d.h .:
int main(){
return fun();
}
dann der C-Compiler nullt die EAX-Register erneut.
Es könnte sein, dass der Optimierer eine andere Optimierungsstrategie für c und C++ hat. – Alex
Quirk des Optimierers? Was macht es ohne Optimierung? –
Wie erhalten Sie die Funktionsnamen, die in den Disassemblies angezeigt werden? 'objdump -d' gibt mir nur Zahlen in den jmp-Anweisungen. – PSkocik