Наиболее очевидный момент, когда const
- это прямая оптимизация, - это передача аргументов функции. Часто важно убедиться, что функция не изменяет данные, поэтому единственными реальными вариантами выбора сигнатуры функции являются:
void f(Type dont_modify); // or
void f(Type const& dont_modify);
Конечно, настоящая магия здесь - передача ссылки, а не создание (дорогой) копии объекта. Но если ссылка не была помечена как const
, это ослабило бы семантику этой функции и привело бы к отрицательным эффектам (таким как усложнение отслеживания ошибок). Следовательно, const
разрешает оптимизацию здесь.
/ EDIT: на самом деле, хороший компилятор может проанализировать поток управления функции, определить, что он не изменяет аргумент, и выполнить оптимизацию (передавая ссылку, а не копию). const
здесь просто помощь компилятору. Однако, поскольку C ++ имеет довольно сложную семантику и такой анализ потока управления может быть очень дорогим для больших функций, мы, вероятно, не должны полагаться на компиляторы для этого. У кого-нибудь есть данные, чтобы поддержать меня / доказать, что я не прав?
/ EDIT2: и да, как только в игру вступают пользовательские конструкторы копирования, это становится еще сложнее, потому что компиляторы, к сожалению, не могут их вызывать в этой ситуации.