Unterstützt const den Optimierer? C ++ [duplizieren]

7

Lasst die heiligen Kriege beginnen: Ich habe eine Reihe verschiedener Meinungen über die Nützlichkeit von const in C ++ gehört. Natürlich wird es in Memberfunktionsdeklarationen usw. verwendet. Aber wie nützlich ist es als Modifikator für Variablen (oder besser Konstanten)? Hilft es dem Optimierer tatsächlich, wenn der Rest des Codes gleich bleibt?

    
bfops 09.10.2010, 15:00
quelle

4 Antworten

4

const hilft dem Optimierer nicht.

Da const mit const_cast weggeworfen werden kann, ist es möglich, Programme zu schreiben, die const an mehreren Stellen verwenden, sie dann wegzuwerfen und Variablen trotzdem zu modifizieren, mit definiertem Verhalten gemäß dem Standard. Der Compiler muss daher den tatsächlichen Code des Programms betrachten, um zu bestimmen, welche Variablen wann geändert werden, und das ist wahrscheinlich ziemlich gut (zum Beispiel könnte es eine nicht-konstante Variable über einen bestimmten Code-Block invariant bestimmen und entsprechend optimieren ).

Wenn der Compiler blind const als Garantie dafür verwendet, dass sich etwas nicht ändert, bricht der Optimierer einige wohlgeformte Programme.

const ist eine Kompilierzeit-Funktion, die Programmierern hilft, korrekten Code zu schreiben, indem sie einige Kompilierzeit-Constraints hinzufügt und einen Code-Vertrag anzeigt (z. B. "Ich verspreche, diesen Parameter nicht zu ändern"). Es hat nichts mit Optimierung zu tun. Während Invarianten für Optimierer wichtig sind, hat dies nichts mit dem const Schlüsselwort zu tun.

Es gibt eine Ausnahme: Objekte, die mit const deklariert wurden. Diese können nicht geändert werden; selbst wenn sie über Casting sind, ist das Verhalten nicht definiert. Hier gibt es einige Feinheit:

%Vor%

Wenn der Compiler const int ci sieht, nimmt er wahrscheinlich an, nimmt an, dass er sich nie ändern wird, weil es zu einem nicht definierten Verhalten wird. Allerdings ist die Wahrscheinlichkeit, dass dies nicht der Engpass in Ihrem Programm ist, es ist nur ein anspruchsvoller #define . Abgesehen davon ist const schwach - nur ein Schlüsselwort für das Typsystem.

    
AshleysBrain 09.10.2010, 15:54
quelle
17

Es gibt viele Fälle, in denen der Modifikator const dem Optimierer nicht hilft, da der Compiler bereits erkennen kann, ob Sie eine Variable geändert haben oder nicht. Der größte Vorteil von const besteht meines Erachtens darin, dass es dem Compiler mitteilt, ob der Programmierer diese Variable modifizieren will, was nützlich ist, um bestimmte Arten von semantischen Fehlern zur Kompilierzeit statt zur Laufzeit zu finden. Jeder Fehler, den Sie zur Kompilierzeit verschieben können, erhöht die Produktivität der Programmierer enorm.

    
Karl Bielefeldt 09.10.2010 15:11
quelle
5

Im Allgemeinen, nein, es wird dem Compiler nicht helfen. Da die Const-Ness in C und C ++ in einer Sekunde weg geworfen werden kann, wäre es für den Compiler schwierig, die notwendigen Annahmen über die erfüllten Code-Anforderungen für Optimierungen zu treffen.

Das heißt, const-Korrektheit sollte immer für seine anderen Vorteile verwendet werden.

    
Johann Gerell 09.10.2010 15:07
quelle
0

Es kann nicht schaden und theoretisch einige Optimierungen zulassen, also können Sie es genauso gut benutzen - wissen Sie nicht, ob irgendwelche Produktionscompiler das tun.

    
Martin Beckett 09.10.2010 15:04
quelle

Tags und Links