Да, оно может.
Большинство const
предназначены исключительно для пользы программиста и не помогают компилятору оптимизировать, потому что их законно отбрасывать, и поэтому они не сообщают компилятору ничего полезного для оптимизации. Однако некоторые 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;
}
как м:
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
изменен, поскольку он может быть изменен в других единицах перевода. Я полагаю, что гипотетический разумный ультракомпилятор может проанализировать всю программу и определить, допустим ли встроенный доступ к _11 _..., но настоящие компиляторы не могут.
person
Praxeolitic
schedule
11.12.2016
const
повлиял на производительность: stackoverflow.com / questions / 1121791 /. Однако по сути это была проблема качества реализации.const
не определял, может компилятор на законных основаниях проводить оптимизацию, просто так случилось, что версия компилятора не смогла сделать это, когда она отсутствовала. - person Steve Jessop   schedule 08.08.2010