Welche C/C-Compiler können Push/Pop-Anweisungen zum Erstellen lokaler Variablen verwenden?
Einführung
Im Gegensatz zur üblichen Praxis, ESP schrittweise zu erhöhen, befasst sich diese Frage mit der Möglichkeit, Push- und Pop-Anweisungen zur Etablierung einzusetzen Lokale Variablen mit dem Ziel, die Code-Kompaktheit und möglicherweise die Leistung zu optimieren.
Überlegungen zum Compiler
Compiler-Optimierung:
Stack Engine Optimierung:
Codebeispiel
Betrachten Sie das folgende Beispiel:
int extfunc(int *, int *); void foo() { int a=1, b=2; extfunc(&a, &b); }
Compiler Ausgabe
GCC, ICC, MSVC und Clang generieren alle Code, der mit einem Push beginnt Anweisung, gefolgt von der Stapelmanipulation und dem Aufruf von extfunc. Dies steht im Einklang mit der Beobachtung, dass moderne Compiler Push für Optimierungen nutzen.
Optimale Lösung
Eine weiter optimierte Lösung wäre:
push 2 # only 2 bytes lea rdi, [rsp + 4] mov dword ptr [rdi], 1 mov rsi, rsp # special case for lea rsi, [rsp + 0] call extfunc(int*, int*) pop rax # alternative to add rsp,8 ret
In In diesem Fall weist ein einzelner Push-Befehl Platz für beide lokalen Variablen zu, während der Stapel 16-Byte-ausgerichtet bleibt. Dadurch wird die Codegröße optimiert und die Effizienz aufrechterhalten.
Zusätzliche Überlegungen
Das obige ist der detaillierte Inhalt vonNutzen moderne C/C-Compiler Push/Pop-Anweisungen für eine effiziente lokale Variablenverwaltung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!