Wenn ich eine Funktion habe, die nur für eine kurze Zeit existiert, macht es einen Unterschied, die Liste der Farben konstant zu halten?
%Vor%Hinweis: Die tatsächliche Liste der Farben enthält Hunderte von Farben, nicht nur die kleine Probe, die ich gezeigt habe, nicht sicher, ob dies auch einen Unterschied macht.
Es verhindert, dass Sie versehentlich Variablen überschreiben, die Sie nicht ändern wollten. "Hoppla!" - Schutz ist wahrscheinlich die wichtigste Funktion von const
.
Hypothetisch könnte ein Compiler irgendeine Art von Optimierung erwarten, weil er weiß, dass eine Variable sich nicht ändern soll, aber meine Tests haben nie einen gefunden, der in der von Ihnen beschriebenen Situation tatsächlich etwas Sinnvolles bewirkt.
const statisch funktioniert haben Sie einen wichtigen Unterschied in Ihrem speziellen Codebeispiel. Da das Array colors [] lokal ist, muss es jedes Mal neu erstellt werden, wenn die Funktion getrandcolor()
aufgerufen wird. Das bedeutet, dass der String-Konstruktor bei jedem Aufruf von getrandcolor()
fünf Mal ausgeführt wird, was sehr unwirtschaftlich ist. const static bedeutet, dass die Daten nur einmal erstellt werden - wenn die Funktion das erste Mal ausgeführt wird - und in einen gemeinsamen Speicherbereich eingefügt werden.
In Bezug auf die Leistung? Nein wahrscheinlich nicht. Es sieht so aus, als könnte Ihr Array auch static
sein und dann vielleicht ja .
In Bezug auf den Code-Stil? Möglicherweise. Obwohl der Zusatz const
Ihren Code ein wenig ausschweifend macht, macht er auch deutlich, dass die Daten nicht geändert werden sollen. Dies ist sowohl Dokumentation als auch sicher .
Idealerweise sind alle Objekte in C ++ standardmäßig Konstanten, und Sie müssten mutable
schreiben, um sie zu Variablen zu machen. Es ist alles rückwärts!
Wenn Sie über Leistung sprechen, dann: no , sollte das keinen Unterschied machen.
Wenn Sie eine lokale Variable als const deklarieren, erhalten Sie folgende Vorteile:
(Übrigens bin ich nicht sicher, was in diesem konkreten Beispiel konstant ist. Mehr bald ...)
Wenn wir von Performances sprechen, aber auch von der Lesbarkeit von Code, sollten Sie die Variable "colors" außerhalb der Funktion erstellen (da ein Array von hundert Größen ziemlich viel Code enthält und die Logik der Funktion maskiert), entweder in einer Initialisierungsfunktion oder auf globaler Ebene. Wenn Sie diese Variable nicht extrahieren, machen Sie sie zumindest statisch.
Wenn dieses Array nur während eines kurzen Zeitraums während der Programmausführung verwendet wird, können Sie es vor dem ersten Aufruf von getcolors auffüllen und es schließlich freigeben, wenn Sie sicher sind, dass Sie es nicht mehr benötigen.
Etwas anderes Beispiel:
%Vor% Der Compiler kann die letzte Zeile nicht so optimieren, dass der Wert 1
verwendet wird, da bar()
den Wert von global_ptr
akzeptiert, in int*
konvertiert und x
dadurch ändert. Dies wäre ein etwas riskantes Coding, aber das Verwerfen eines Const-Qualifiers und das Mutieren ist gültig, vorausgesetzt, der Verweis ist wirklich änderbar, also muss der Compiler dies zulassen.
Aber, wenn x
als const
markiert war, dann wäre ungültig für bar()
, um const und muate wegzuwerfen, und der Optimierer kann also% x
still annehmen enthält den Wert 1
, wenn es gedruckt wird.
Optimierer erkennen sicherlich Kompilierzeitkonstanten für diese Art der Optimierung, also wäre es nicht verwunderlich, wenn sie den ausgegebenen Code verändern. Wie viel Unterschied es zur Leistung macht, weiß ich nicht. Es ist nicht schwer, Fälle zu erzeugen, in denen das Identifizieren einer Konstanten beispielsweise eine (teure) Division durch eine (billigere) Bit-Twiddlung ersetzen oder Ausdrücke mit x
und eine Reihe anderer Konstanten zur Kompilierungszeit statt zur Laufzeit berechnen kann .
Außerdem kann die Link-Zeit-Optimierung erlauben, dass bar
inline ist. In diesem Fall kann der Link-Time-Optimierer seinen Inhalt genauer untersuchen und kann seine Modifizierung x
sogar in der nicht-verknüpften Version ausschließen. const Fall.
In Ihrem Beispiel kann jedoch kein Verweis auf colors
in unbekannten Code umgewandelt werden, sodass der Unterschied nicht auftritt. Wie auch immer, eine const-Zeichenkette ist wahrscheinlich schwieriger zu optimieren als ein const int, also gibt es noch weniger Chancen, dass Sie eine brillante Optimierung mit const
ermöglichen.