Да, оно может.
Большинство const
s предназначены исключительно для пользы программиста и не помогают компилятору оптимизировать, потому что их законно отбрасывать, и поэтому они не сообщают компилятору ничего полезного для оптимизации. Однако некоторые const
s не могут быть (юридически) отброшены, и они предоставляют компилятору полезную информацию для оптимизации.
Например, доступ к глобальной переменной, определенной с const
типом, может быть встроен, в то время как переменная без const
типа не может быть встроена, поскольку она может измениться во время выполнения.
https://godbolt.org/g/UEX4NB
C ++:
int foo1 = 1;
const int foo2 = 2;
int get_foo1() {
return foo1;
}
int get_foo2() {
return foo2;
}
как м:
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
С практической точки зрения, имейте в виду, что, хотя производительность const
может улучшиться, в большинстве случаев это не так или будет, но это изменение не будет заметно. Основная польза const
- не оптимизация.
Стив Джессоп приводит еще один пример в своем комментарии к исходному вопросу, который поднимает кое-что, о чем стоит упомянуть. В области видимости блока компилятор может определить, будет ли переменная изменена, и оптимизировать ее соответствующим образом, независимо от того const
, потому что компилятор может видеть все использования переменной. Напротив, в приведенном выше примере невозможно предсказать, foo1
будет ли оно изменено, поскольку оно может быть изменено в других единицах перевода. Я полагаю, что гипотетический разумный ультракомпилятор может проанализировать всю программу и определить, действительно ли встроенный доступ к foo1
... но настоящие компиляторы не могут.