Heim > Backend-Entwicklung > C++ > Nutzen C/C-Compiler Push/Pop-Anweisungen für die Erstellung lokaler Variablen?

Nutzen C/C-Compiler Push/Pop-Anweisungen für die Erstellung lokaler Variablen?

Mary-Kate Olsen
Freigeben: 2024-12-09 11:58:10
Original
301 Leute haben es durchsucht

Do C/C   Compilers Utilize Push/Pop Instructions for Local Variable Creation?

C/C-Compiler mit Push/Pop-Anweisungen für lokale Variablen

Einführung

Traditionelle C/C-Compiler erstellen lokale Variablen durch Erhöhen des Stapelzeigers (ESP) einmal. Die Verwendung von Push/Pop-Anweisungen kann jedoch zu kompakterem und möglicherweise schnellerem Code führen. In diesem Artikel wird untersucht, welche Compiler diese Optimierung bieten.

Compiler-Unterstützung

Untersuchungen zeigen, dass alle vier großen x86-Compiler (GCC, Clang, ICC und MSVC) derzeit keine Push-/ Pop-Anweisungen zum Erstellen lokaler Variablen. Stattdessen bevorzugen sie eine Variation der älteren Methode, bei der sub rsp, c verwendet wird, um den Stapelzeiger zu verringern.

Vorteile von Push/Pop

Die Verwendung von Push/Pop für lokale Variablen bietet mehrere Vorteile:

  • Reduzierung der Codegröße: Push-Anweisungen umfassen nur 2 Bytes im Vergleich zu 9-11 Bytes für sub/mov-Paare.
  • Potenzielle Leistungsverbesserung: Auf CPUs mit einer Stack-Engine verursachen Push-Vorgänge möglicherweise weniger Stack-Synchronisierungs-UOPs als Sub-RSP, was sie in bestimmten Szenarien schneller macht.

Wann man Push/Pop vermeiden sollte

Push/Pop kann zwar von Vorteil sein, wird aber auf keinen Fall empfohlen Fälle. Beispielsweise kann es in Kombination mit [rsp >

Verbesserte Kompilierung mit push/pop:

int extfunc(int *,int *);

void foo() {
    int a=1, b=2;
    extfunc(&a, &b);
}
Nach dem Login kopieren
Hinweis:

Dieses Beispiel optimiert Kompaktheit und Geschwindigkeit, indem die letzten 4 Bytes der Push-Anweisung mit den ersten 4 Bytes der Lea-Anweisung überlappt werden .Fazit

# compiled for the x86-64 System V calling convention:
# integer args in rdi, rsi  (,rdx, rcx, r8, r9)
    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
Nach dem Login kopieren
Push/Pop-Anweisungen können beim Erstellen lokaler Variablen zwar Codegrößen- und Leistungsvorteile bieten, sie sind es aber auch Wird derzeit von Mainstream-C/C-Compilern nicht verwendet. Dies ist wahrscheinlich auf das Potenzial für zusätzliche Stack-Synchronisierungs-Uops und die Komplexität bei der Verwaltung von Stack-Offsets zurückzuführen. Da sich jedoch Hardware- und Compiler-Optimierungen weiterentwickeln, ist es möglich, dass Push/Pop für lokale Variablen in Zukunft weiter verbreitet wird.

Das obige ist der detaillierte Inhalt vonNutzen C/C-Compiler Push/Pop-Anweisungen für die Erstellung lokaler Variablen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage