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.
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.
Die Verwendung von Push/Pop für lokale Variablen bietet mehrere Vorteile:
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); }
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
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!