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. Einige const
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 ohne const
Typ nicht eingefügt werden 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
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 von const
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, ob foo1
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 auf foo1
... gültig ist, echte Compiler jedoch nicht.