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 const
s 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 const
tipo pode ser sequencial, enquanto outra sem um const
tipo 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 const
possa 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 const
nã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 foo1
sofrerá 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.