Так це може.
Більшість 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;
}
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
... але справжні компілятори не можуть.