Да, это возможно.
Большинство const
s предназначены исключительно для пользы программиста и не помогают компилятору оптимизировать, потому что это законно, чтобы отбрасывать их, и поэтому они ничего не сообщают компиляторуполезно для оптимизации.Однако некоторые const
не могут быть (законно) отброшены, и они предоставляют компилятору полезную информацию для оптимизации.
Например, доступ к глобальной переменной, определенной с типом 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;
}
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
В практическом плане имейте в виду, что, хотя const
может улучшить производительность, в большинстве случаев она не будет или будет, но изменения не будут заметны.Основная полезность const
заключается не в оптимизации.
Стив Джессоп приводит еще один пример в своем комментарии к исходному вопросу, который поднимает нечто, о чем стоит упомянуть.В области видимости блока компилятор может определить, будет ли переменная изменяться и соответственно оптимизироваться, независимо от const
, потому что компилятор может видеть все варианты использования переменной.Напротив, в приведенном выше примере невозможно предсказать, будет ли foo1
видоизменяться, поскольку он может быть изменен в других единицах перевода.Я полагаю, что гипотетический разумный ультракомпилятор может проанализировать всю программу и определить, является ли действительным встроенный доступ к foo1
... но реальные компиляторы не могут.