2017-02-07 2 views

Antwort

11

Diese Codezeile hat keine beobachtbare Wirkung in der abstrakten Maschine des C++ Standards.

Compiler können sie im Speicher frei speichern oder nicht. Wenn es gespeichert ist, kann es nicht über irgendein Verhalten, das unter dem C++ - Standard definiert ist, zugegriffen werden. Die meisten Compiler, die vernünftige Optimierungseinstellungen aktiviert haben, behandeln dies als Noop und Compiler guter Qualität sollten Warnungen ausgeben, wenn Ihre Warnstufe vernünftig ist.

Im Allgemeinen wird das Verhalten von C++ - Code im Standard als Verhalten einer abstrakten Maschine beschrieben. Dies ist in Sprachen ziemlich üblich. Im Gegensatz zu einigen anderen abstrakten Maschinensprachen lässt C++ jedoch viele Operationen auf der abstrakten Maschine undefined.

Normkonforme Compiler können beliebigen Maschinencode (oder was auch immer) generieren, der sich wie der abstrakte Computer verhält, sofern das Verhalten dieses Rechners durch den Standard definiert ist.

Dies bedeutet, dass Dinge, die keine beobachtbaren Auswirkungen haben, vollständig von einem C++ - Compiler eliminiert werden können. Dies beinhaltet die Aussage 3;.

Auch Dinge mit beobachtbaren Effekten können eliminiert werden, solange die beobachtbaren Effekte bestehen bleiben. Zum Beispiel:

char const* a = "123"; 
for (int i = 0; i < 3; ++i) { 
    std::cout << a[i]; 
} 
std::cout << "\n"; 

der beobachtbare Effekt hierbei ist, dass 123\n gedruckt wird. Die Variable a und die Tatsache, dass sie auf einen Nur-Lese-Puffer zeigt, der die Bytes '1', '2', '3', '\0' enthält, sind nicht direkt beobachtbar. Wenige Dinge sind.

Noch wichtiger, da der Compiler diese gesamte Funktion sehen kann, ist das einzige, was getan wird, dass die Zeichen an std::cout übergeben werden.

So kann dieser Puffer und die Variable a eliminiert werden, solange das Programm as-if es würde, bis zu undefiniert Verhalten.

Viele der Dinge, die noch undefiniert sind, erlauben wirklich aggressive Optimierungen. Sie können auch wirklich schwer zu Bugs aufspüren.


Es gibt eine "naive" Umwandlung Ihres C++ - Codes in C/Assemblercode. Viele Leute stellen es dar, wenn sie gefragt werden, was ein Compiler macht, und nennen alles, was diesen Schritten nicht folgt, "Optimierung".

Dies beschreibt jedoch nicht, was jeder vernünftige C++ - Compiler in einem vernünftigen Probject tut.

+1

Lesen Sie das als "Noop" und nicht "No-Op" und bekam ein kleines Lachen. +1 – mascoj

+0

also wie kommt const char * a = "123"; hat eine Bedeutung?Wo ist "123" gespeichert? –

+0

@dangha: In Ihrer ausführbaren Datei. Das heißt, es wird möglicherweise nicht gespeichert, wenn "a" nicht verwendet wird (Optimierung, wenn kein beobachtbarer Effekt vorliegt). – MSalters

Verwandte Themen