Assembled c ++ scheint überflüssige Anweisungen zu enthalten

8

Ich habe eine cpp-Datei, die nur folgendes enthält:

%Vor%

Ich kompiliere mit:

%Vor%

Dies ergibt f.s containing:

%Vor%

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?

    
Rai 04.05.2017, 20:43
quelle

2 Antworten

4

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:

%Vor%

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

%Vor%

Die Ausgabe wäre etwas ähnlich wie:

%Vor%

Ein Blick auf Code mit verschiedenen Zielen

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.

    
Michael Petch 05.05.2017, 16:03
quelle
0

Diese Anweisungen werden verwendet, um auf den Stapel in Funktionskörpern zuzugreifen. Es ist eine Generalisierung und wird für Debugging-Zwecke verwendet.

    
sithereal 04.05.2017 20:48
quelle

Tags und Links