Ich habe eine cpp-Datei, die nur folgendes enthält:
%Vor%Ich kompiliere mit:
%Vor% Dies ergibt f.s
containing:
Wenn ich die Anweisungen push
, mov
und pop
lösche und assemble (auf einem Mac verwende ich Clang), ist die resultierende Objektdatei 4 Bytes kleiner. Das Verknüpfen und Ausführen von Ergebnissen ergibt dasselbe Verhalten und dieselbe ausführbare Datei.
Dies deutet darauf hin, dass diese Anweisungen überflüssig sind - warum beschäftigt der Compiler sie? Ist das einfach eine Optimierung, die dem Linker überlassen wird?
CLANG / CLANG ++ ist sowohl ein nativer Compiler als auch ein Cross-Compiler, der mehrere Ziele unterstützt. Unter OS / X sind die Ziele standardmäßig eine Variante von x86_64-apple-darwin
für 64-Bit-Code und i386-apple-darwin
für 32-Bit-Code. Der Code, den Sie sehen, ähnelt dieser Form:
Wird erzeugt, um Stapelrahmen einzuführen. Standardmäßig aktiviert CLANG ++ implizit Stapelrahmen für die Apple Darwin Ziele . Dies unterscheidet sich von den Linux-Zielen wie x86_64-linux-gnu
und i386-linux-gnu
. Stack-Frames können sich als nützlich erweisen, wenn es darum geht, Bibliotheken zu profilieren und zu entsperren und Debugging auf den OS / X-Plattformen zu unterstützen. Aus diesem Grund glaube ich, dass sie sie standardmäßig aktivieren.
Sie können Frame-Zeiger explizit mit CLANG ++ weglassen, indem Sie die Option -fomit-frame-pointer
verwenden. Wenn Sie den Build-Befehl verwenden
Die Ausgabe wäre etwas ähnlich wie:
%Vor%Wenn Sie verschiedene Ziele mit CLANG ++ verwenden, werden Sie feststellen, dass das Verhalten anders ist. Dies ist ein x86-64-Linux-Ziel, bei dem wir den Rahmenzeiger nicht explizit weglassen:
%Vor%Was erzeugt:
%Vor%Dies ist Ihr ursprüngliches x86-64 Apple Darwin Ziel:
%Vor%Was erzeugt:
%Vor%Und dann das Apple-Ziel x86-64 mit Rahmenzeigern weggelassen:
%Vor%Was erzeugt:
%Vor%Sie können einen Vergleich dieser Ziele auf Godbolt . Die erste Spalte generierten Codes ähnelt der Frage - Apple Target mit impliziten Frame-Zeigern. Das zweite ist ein Apple-Ziel ohne Rahmenzeiger und das dritte ist ein x86-64-Linux-Ziel.
Tags und Links optimization c++ assembly x86 macos