C++ Die Sprache ist durch den Standard definiert. Im Standard beschreibt es das Verhalten einer abstrakten Maschine, die mit wohlgeformten Programmen arbeitet, die das vom Standard definierte Verhalten ausführen.
Eine Kernregel von C++ ist die as-if Regel. Unter der as-if Regel ist der generierte Code des Compilers frei, sich zu verhalten jedoch wünscht er, solange sein Verhalten, das unter dem Standard beobachtbar ist, übereinstimmt, was der Standard angibt.
Es gibt keine Möglichkeit, unter dem Standard die Existenz des 1
in 1+2
zu beobachten. Unter dem Standard kann der Compiler also Code kompilieren, für den 1
niemals existiert hat, und einfach die Nummer 3
generieren.
Was mehr ist, wenn Sie die nie x
Variable verwenden, die Anweisung
int x = 1+2+3+4;
keine Wirkung hat. Also ist es den Compilern frei, sie niemals zu benutzen. In der Tat, Sie nehmen nie einen Verweis auf den Wert x
oder ändern Sie ihren Wert, dann kann die Variable x
vollständig aus dem Programm entfernt werden. Wann immer es verwendet wird, kann der Wert 10
es ersetzen.
Typischerweise optimierende Compiler etwas tun „statische einfache Zuordnung“ genannt, wo auch wenn Sie x
mehrfach zuweisen es behandelt sie tatsächlich als eine Folge von Zuweisungen verschiedenen Variablen.Nur wenn Sie eine Referenz oder einen Zeiger auf x
nehmen, bricht dies zusammen.
So
int x = 1+2+3+4;
std::cout << x;
x += 20;
std::cout << x;
als
const int x_0 = 10;
std::cout << x_0;
const int x_1 = x_0 + 20;
std::cout << x_1;
und dann den offensichtlichen Optimierungen einfach Drucken 10
und 30
fällt direkt aus behandelt werden.
Wenn Sie über C++ auf diese Weise denken, müssen Sie darauf achten, was beobachtbares Verhalten ist, und wissen, dass der Compiler frei ist, den Rest zu verwerfen. Mit ein wenig Vorsicht können Sie also Zero-Cost-Abstraktionen erstellen, bei denen Zwischenergebnisse zur Laufzeit nie wirklich existieren.
Fragen Sie nach der Abstraktion, die der Sprachstandard beschreibt, oder nach dem Maschinencode, der von einem Compiler in der Praxis ausgegeben wird? –
Wer sagt, dass diese Variable sogar im endgültigen Code existiert? Sie fragen nach Details, die nur Ihr Disassembler kennt. AFAIK, C++ ermöglicht es Compilern, so viele Provisorien wie ihre Maschinenherzen zu erstellen. Die erste Zeile könnte 'int a = int (int (int (int (1)))) sein, für alles was sie interessiert. – GManNickG
@OliverCharlesworth Ich denke, eine Mischung aus beiden – MathFromScratch