const
очень мало помогает или практически ничего не оптимизирует.Компилятору в основном требуется глобальное представление кода, чтобы решить, являются ли переменные действительно постоянными или нет, и компилятор определит это независимо от модификаторов const
.Рассмотрим этот код (например, в godbolt.org)
void foo(const int& v) { const_cast<int&>(v) = 6; }
const int bar() { return 9; }
int main() {
const int a = bar();
const int b = a;
foo(a);
return a-b;
}
, который приведет к -O3 в gcc8.3 и clang7 к очень правильному и оптимальному (даже с дополнительным несущественным const_cast
, который вызываетнеопределенное поведение):
foo(int const&): # @foo(int const&)
mov dword ptr [rdi], 6
ret
bar(): # @bar()
mov eax, 9
ret
main: # @main
mov eax, -3
ret
и что важно: это идентично, если вы замените все const int
просто int
.Таким образом, компилятору помогает , а не , это глобальный просмотр и анализ кода.
В заключение позвольте мне процитировать эту очень интересную страницу GotW от Херба Саттера http://www.gotw.ca/gotw/081.htm, которая, как я вижу, также начала весь выпуск.
Таким образом, const
остается особенностью преимущественно для программистов.Компиляторы умнее нас и не доверяют нам в любом случае; -)
И последнее замечание: почти во всех случаях оптимизация является функцией компилятора, а не языка.Есть некоторые исключения из этого, например copy elision
, но вопрос этого вопроса не относится к их числу.