Ja kann es.
Die meisten const
s sind rein zum Vorteil des Programmierers und nicht helfen, den Compiler zu optimieren, weil es legal ist, sie wegzuwerfen und so dem Compiler nichts Nützliches für die Optimierung zu sagen. Einige const
s können jedoch nicht (legal) weggeworfen werden, und diese liefern dem Compiler nützliche Informationen zur Optimierung.
Als Beispiel kann der Zugriff auf eine globale Variable, die mit einem const
Typ definiert wurde, inline ausgeführt werden, während eine ohne const
Typ nicht inline sein kann, da sie sich zur Laufzeit ändern kann.
https://godbolt.org/g/UEX4NB
C++:
int foo1 = 1;
const int foo2 = 2;
int get_foo1() {
return foo1;
}
int get_foo2() {
return foo2;
}
asm:
foo1:
.long 1
foo2:
.long 2
get_foo1():
push rbp
mov rbp, rsp
mov eax, DWORD PTR foo1[rip] ; foo1 must be accessed by address
pop rbp
ret
get_foo2():
push rbp
mov rbp, rsp
mov eax, 2 ; foo2 has been replaced with an immediate 2
pop rbp
ret
in der Praxis, bedenken Sie, dass während const
Leistung verbessern können, in den meisten Fällen wird es oder nicht wird aber die Änderung wird nicht auffallen. Die primäre Nützlichkeit von const
ist keine Optimierung.
Steve Jessop gibt ein weiteres Beispiel in seinem Kommentar zu der ursprünglichen Frage, die etwas Erwähnenswertes bringt. In einem Blockbereich ist es möglich, dass ein Compiler ableitet, ob eine Variable mutiert ist, und entsprechend optimieren, unabhängig von const
, da der Compiler alle Verwendungen der Variablen sehen kann. Im obigen Beispiel ist es hingegen unmöglich vorherzusagen, ob foo1
mutiert wird, da es in anderen Übersetzungseinheiten geändert werden könnte. Ich nehme an, ein hypothetischer Sentient-Ultra-Compiler könnte ein ganzes Programm analysieren und feststellen, ob es einen Inline-Zugriff auf foo1
gibt ... aber echte Compiler können das nicht.
Const-Korrektheit ist eine der besten Praktiken in Bezug auf Wartbarkeit. Wenn Ihr C++ - Code nicht const-korrekt ist, ist es im Grunde genommen ein Haufen Mist, der darauf wartet, dass eine Katastrophe eintritt. Es ist nicht beabsichtigt, die Leistung zu beeinträchtigen. –
@Neil Butterworth: leider ist das Gegenteil nicht wahr. – Beta
Hier ist ein Beispiel, wo 'const' einen Leistungsunterschied gemacht hat: http://StackOverflow.com/questions/1121791/optimization-of-division-in-gcc. Es war jedoch im Wesentlichen ein Qualitätsproblem. 'const' hat nicht festgestellt, ob der Compiler * die Optimierung legal vornehmen kann, es ist einfach passiert, dass die Version des Compilers es nicht geschafft hat, wenn sie fehlte. –