Ich habe mehrfach gelesen, dass das Erzwingen der Konstantenkorrektheit in Ihrem C- oder C ++ - Code nicht nur eine gute Praxis in Bezug auf die Wartbarkeit ist, sondern auch Ihrem Compiler ermöglicht, Optimierungen durchzuführen. Ich habe jedoch auch das genaue Gegenteil gelesen - dass es die Leistung überhaupt nicht beeinträchtigt.
Haben Sie daher Beispiele, bei denen die Konstantenkorrektheit Ihrem Compiler dabei helfen kann, die Leistung Ihres Programms zu verbessern?
c++
performance
const-correctness
Shuhalo
quelle
quelle
const
ein Leistungsunterschied aufgetreten ist : stackoverflow.com/questions/1121791/… . Es handelte sich jedoch im Wesentlichen um ein Problem der Implementierungsqualität.const
nicht festzustellen , ob der Compiler könnte rechtlich die Optimierung machen, es ist einfach passiert , dass Version des Compilers zu machen , schlug fehl , wenn es fehlt.Antworten:
const
Korrektheit kann die Leistung nicht verbessern, daconst_cast
undmutable
in der Sprache ist und Code die Regeln konform brechen kann. Dies wird in C ++ 11 noch schlimmer, wo Ihreconst
Daten beispielsweise ein Zeiger auf a sein könnenstd::atomic
, was bedeutet, dass der Compiler Änderungen berücksichtigen muss, die von anderen Threads vorgenommen wurden.Trotzdem ist es für den Compiler trivial, den generierten Code zu überprüfen, festzustellen, ob er tatsächlich in eine bestimmte Variable schreibt, und Optimierungen entsprechend anzuwenden.
Das alles gesagt,
const
Korrektheit ist eine gute Sache in Bezug auf Wartbarkeit. Andernfalls könnten Clients Ihrer Klasse die internen Mitglieder dieser Klasse beschädigen. Betrachten Sie zum Beispiel den Standardstd::string::c_str()
- wenn er keinen konstanten Wert zurückgeben könnte, könnten Sie mit dem internen Puffer des Strings herumschrauben!Nicht
const
aus Leistungsgründen verwenden. Verwenden Sie es aus Gründen der Wartbarkeit.quelle
const
sind Wegweiser mit der Aufschrift "Sie machen etwas Dummes".Ja, kann es.
Die meisten
const
s dienen ausschließlich dem Programmierer und helfen dem Compiler nicht bei der Optimierung, da es legal ist, sie wegzuwerfen, und sie dem Compiler nichts Nützliches für die Optimierung mitteilen. Einigeconst
s können jedoch nicht (legal) weggeworfen werden, und diese liefern dem Compiler nützliche Informationen zur Optimierung.Beispielsweise kann der Zugriff auf eine mit einem
const
Typ definierte globale Variable eingebunden werden, während eine ohneconst
Typ nicht eingefügt werden kann, da sie sich zur Laufzeit ändern kann.https://godbolt.org/g/UEX4NB
C ++:
asm:
Denken Sie in der Praxis daran, dass
const
die Leistung zwar verbessert werden kann, in den meisten Fällen jedoch nicht oder nicht, aber die Änderung nicht spürbar ist. Der Hauptnutzen vonconst
ist nicht die Optimierung.Steve Jessop gibt in seinem Kommentar zur ursprünglichen Frage ein weiteres Beispiel, das etwas Erwähnenswertes aufwirft. In einem Blockbereich kann ein Compiler ableiten, ob eine Variable mutiert wird, und entsprechend optimieren, unabhängig davon
const
, da der Compiler alle Verwendungen der Variablen sehen kann. Im obigen Beispiel ist es dagegen unmöglich vorherzusagen, obfoo1
eine Mutation vorliegt, da sie in anderen Übersetzungseinheiten geändert werden könnte. Ich nehme an, ein hypothetischer empfindungsfähiger Ultra-Compiler könnte ein gesamtes Programm analysieren und feststellen, ob der Inline-Zugriff auffoo1
... gültig ist, echte Compiler jedoch nicht.quelle
nach meiner erfahrung nein
Für skalare Variablen kann der Compiler bestimmen, wann der Wert geändert wird, und die erforderliche Optimierung selbst durchführen.
Für Array-Zeiger ist die Konstantenkorrektheit keine Garantie dafür, dass die Werte bei potenziellen Aliasing-Problemen wirklich konstant sind. Daher kann der Compiler den const-Modifikator nicht allein verwenden, um Optimierungen durchzuführen
Wenn Sie nach einer Optimierung suchen, sollten Sie
__restrict__
spezielle Funktionsmodifikatoren / -attribute in Betracht ziehen : http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.htmlquelle
Ein bisschen alt, gilt aber immer noch: http://www.gotw.ca/gotw/081.htm Und noch mehr: http://cpp-next.com/archive/2009/08/want-speed-pass-by -Wert/
quelle