Heim >Backend-Entwicklung >C++ >Nutzen moderne C/C-Compiler Push/Pop-Anweisungen für eine effiziente lokale Variablenverwaltung?

Nutzen moderne C/C-Compiler Push/Pop-Anweisungen für eine effiziente lokale Variablenverwaltung?

Barbara Streisand
Barbara StreisandOriginal
2024-12-02 19:18:15558Durchsuche

Do Modern C/C   Compilers Utilize Push/Pop Instructions for Efficient Local Variable Management?

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:

  • Alle vier großen x86-Compiler (GCC, ICC, MSVC, Clang) haben Push for aufgegeben Optimierungen.
  • Dies ist in erster Linie auf die hohe Auslastung von Push auf den CPUs von gestern zurückzuführen, die sich negativ auf die superskalare Kerneffizienz auswirkte.
  • Moderne Compiler haben jedoch Push/Pop zur Leistungssteigerung wieder eingeführt. insbesondere bei der Manipulation von Stack-Argumenten und aufruferhaltenen Registern.

Stack Engine Optimierung:

  • Neuere CPUs wie Intel seit Pentium-M und AMD seit Bulldozer verfügen über eine „Stack-Engine“, die RSP-Änderungen effizient verfolgt.
  • Diese Funktion ermöglicht die Verwendung von Push/Pop/Call/Ret ohne Leistungseinbußen.
  • Der sorgfältige Einsatz von Push/Pop kann zu Leistungssteigerungen führen Optimierung auf Geschwindigkeit und nicht nur auf Codegröße.

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 Mischen von Push mit [rsp]-Adressierungsmodi kann auf Intel-CPUs zu zusätzlichen Stapelsynchronisierungs-Uops führen. möglicherweise die Effizienz verringern.
  • Compiler verzichten im Allgemeinen auf die Implementierung dieser Optimierung, da sie eine sorgfältige Berechnung und Abwägung von Kompromissen erfordert, um Leistung zu vermeiden Abbau.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn