Sim pode.
A maioria dos programas consté puramente para o benefício do programador e não ajuda o compilador a otimizar porque é legal descartá-los e, portanto, eles não informam ao compilador nada de útil para a otimização. No entanto, alguns consts não podem ser (legalmente) descartados e fornecem ao compilador informações úteis para otimização.
Como exemplo, o acesso a uma variável global definida com um consttipo pode ser sequencial, enquanto outra sem um consttipo não pode ser sequencial porque pode ser alterada em tempo de execução.
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
Em termos práticos, tenha em mente que, embora constpossa melhorar o desempenho, na maioria dos casos não vai ou vai, mas a mudança não será perceptível. A principal utilidade do constnão é a otimização.
Steve Jessop dá outro exemplo em seu comentário sobre a questão original, que traz algo que vale a pena mencionar. Em um escopo de bloco, é possível para um compilador deduzir se uma variável será mutada e otimizar de acordo, independentemente de const, porque o compilador pode ver todos os usos da variável. Em contraste, no exemplo acima, é impossível prever se ele foo1sofrerá mutação, pois pode ser modificado em outras unidades de tradução. Suponho que um ultracompilador senciente hipotético poderia analisar um programa inteiro e determinar se ele é válido para acesso embutido a foo1... mas compiladores reais não podem.