Machen "const" -Deklarationen den Compiler (GCC) schneller Code? [Duplikat]

7

Können const -Deklarationen dem Compiler (GCC) helfen, schnelleren Code zu erzeugen oder sind sie nur für die Lesbarkeit und Korrektheit von Nutzen?

Zed Shaw hat argumentiert, dass const nutzlos ist oder in C / C ++ überstrapaziert wird:

  

Als nächstes ist all die bizarre Faszination für const. Aus irgendeinem seltsamen Grund   C ++ liebt es, Sie dazu zu bringen, auf jeden Teil einer Deklaration zu stoßen, und   Trotzdem bekomme ich das gleiche Endergebnis wie C: Eine Funktion wird aufgerufen. (...)

(Von: Ссылка )

    
MaxB 19.12.2013, 22:42
quelle

4 Antworten

2

Im allgemeinen const modifier on-Methode können Verweise und Zeiger aus mehreren Gründen nicht zur Optimierung des Codes verwendet werden. Der erste ist, dass const modifier in diesen Kontexten keine Garantien über die zugrunde liegenden Daten gibt, die sich nicht ändern, sondern es nur schwieriger macht, sie zu modifizieren. Hier ist ein klassisches Beispiel

%Vor%

In diesem Fall ist es sehr wahrscheinlich, dass p1.field in diesem Code geändert wird. Der offensichtlichste Fall ist, dass sich p1 und p2 auf denselben Wert beziehen.

%Vor%

Daher gibt es keine wirkliche Optimierung, die der Compiler hier machen kann. Der Parameter const ist genauso gefährlich wie der nicht-konstante.

Der andere Grund, warum es nicht wirklich optimieren kann, ist, dass jeder in C ++ mit const_cast betrügen kann.

%Vor%

Selbst wenn Sie also mit einer einzigen const -Referenz arbeiten, können die Werte unter der Haube noch frei geändert werden.

    
JaredPar 19.12.2013, 22:52
quelle
9

Ja. Hier ist ein konkretes Beispiel. const ermöglicht es, Argumente nach const& und nicht nach Wert zu übergeben (was eine kostspielige Kopie erforderlich macht). Es ist wichtig zu wissen, dass die Alternative zu pass-by- const& nicht pass-by- & ist, da letztere nicht erlaubt, dass Provisorien gebunden werden. Also, zum Beispiel, dieser Code:

%Vor%

kann foo operator +(foo const&, foo const&) aufrufen, aber nicht kann foo operator +(foo&, foo&) aufrufen.

Auf diese Weise hilft const , Kopien zu vermeiden.

Aber im Allgemeinen ist const ein Werkzeug, um Korrektheit sicherzustellen, nicht um Optimierungen zu unterstützen.

Wie auch immer, Zed Shaw hat keine Ahnung, wovon er redet. Der Rest seiner Tirade ist übrigens falsch informiert.

    
Konrad Rudolph 19.12.2013 22:57
quelle
4

Ja, const kann (nicht garantiert) dem Compiler helfen, schnelleren / korrekeren Code zu erzeugen. Mehr noch als nicht, sie sind nur ein Modifikator für Daten, die Sie sowohl dem Compiler als auch anderen Personen, die Ihren Code lesen, mitteilen, dass einige Daten nicht geändert werden sollen. Dies hilft dem Typsystem dabei, mehr korrekte Software zu schreiben.

Wichtiger als Optimierungen, sie verhindern nur, dass Ihr eigener Code und Personen, die Ihren Code verwenden, in Daten schreiben, von denen Sie annehmen, dass sie invariant sind.

    
yan 19.12.2013 22:44
quelle
4

Nein, const hilft dem Compiler nicht, schneller Code zu machen. Const steht für const-Korrektheit, nicht für Optimierungen.

Der C ++ - Standard besagt, dass const -Elemente nicht geändert werden können, aber auch besagt, dass const_cast den const -Modifizierer aus einem Objekt entfernen und beschreibbar machen soll (es sei denn, er wird gefunden) in tatsächlichem Nur-Lese-Speicher, in welchem ​​Fall das Verhalten nicht definiert ist); Daher kann const im Allgemeinen nicht bedeuten, dass sich die Zielvariable nicht ändert.

Ich kann nur an diese beiden sehr engen Szenarien denken, in denen const schneller Code produziert als nicht:

  • Die Variable ist global mit interner Verknüpfung ( static ) und wird als Verweis oder Zeiger an eine Funktion übergeben, die in einer anderen Übersetzungseinheit (andere Datei) definiert ist. In diesem Fall kann der Compiler nicht darauf zugreifen, wenn er nicht als const ;
  • markiert ist
  • Die Variable ist global mit externer Verknüpfung ( extern ). Lesevorgänge in const extern können innerhalb der Datei, die definiert, (aber nirgendwo anders)
  • sein

Wenn const auf eine globale Variable angewendet wird, darf der Compiler davon ausgehen, dass sich der Wert niemals ändert, da er ihn im Nur-Lese-Speicher ablegt, was ein undefiniertes Verhalten bedeutet, wenn das Programm versucht, es zu modifizieren. und Compilerautoren lieben sich auf die Gefahr eines undefinierten Verhaltens zu verlassen, um Code schneller zu machen.

Beachten Sie, dass beide Szenarien nur auf globale Variablen anwenden, die wahrscheinlich nur einen sehr kleinen Teil der Variablen in Ihrem Programm ausmachen. Zu seinem Vorteil bedeutet const jedoch static auf globaler Ebene in C ++ (dies ist in C nicht der Fall).

Jemand oben sagte, dass die Verwendung von const Code schneller machen kann, da const references verwendet werden können. Ich würde hier argumentieren, dass das, was den Code schneller macht, die Verwendung einer Referenz ist, nicht die Verwendung von const .

Das heißt, ich glaube immer noch, dass const ein sehr scharfes Messer ist, mit dem Sie sich nicht schneiden können, und ich würde empfehlen, dass Sie es verwenden, wann immer es angebracht ist, aber tun Sie es aus Leistungsgründen nicht.

>     
zneak 19.12.2013 23:00
quelle

Tags und Links