Может ли const-правильность улучшить производительность?

Я много раз читал, что принудительное использование const-корректности в вашем коде на C или C ++ является не только хорошей практикой в ​​отношении удобства обслуживания, но также может позволить вашему компилятору выполнять оптимизацию. Однако я также прочитал полную противоположность: она совершенно не влияет на производительность.

Поэтому у вас есть примеры, когда правильная константа может помочь вашему компилятору улучшить вашу программу? s производительность?

76
задан theJollySin 6 September 2016 в 23:19
поделиться

3 ответа

Корректность

const не может улучшить производительность, потому что const_cast и mutable находятся в языке и позволяют коду конформно нарушать правила. Это становится еще хуже в C++11, где ваши данные const могут быть, например, указателем на std::atomic, что означает, что компилятор должен уважать изменения, сделанные другими потоками.

При этом для компилятора не составляет труда посмотреть на генерируемый им код и определить, действительно ли он записывает в данную переменную, и применить соответствующие оптимизации.

При всем этом, const корректность - это хорошо с точки зрения сопровождаемости. В противном случае клиенты вашего класса могут сломать внутренние члены этого класса. Например, рассмотрим стандартную std::string::c_str() -- если бы она не могла возвращать const-значение, вы могли бы возиться с внутренним буфером строки!

Не используйте const по причинам производительности. Используйте его по соображениям сопровождаемости.

65
ответ дан 24 November 2019 в 11:22
поделиться

по моему опыту, нет

Для скалярных переменных компилятор способен определить, когда значение изменяется, и сам выполнить необходимую оптимизацию.

Для указателей массивов корректность const не является гарантией того, что значения действительно постоянны в присутствии потенциальных проблем с алиасингом. Следовательно, компилятор не может использовать модификатор const для оптимизации

если вы ищете оптимизацию, вам следует рассмотреть __restrict__ или специальные модификаторы/атрибуты функций: http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

6
ответ дан 24 November 2019 в 11:22
поделиться

Немного устарело, но все еще применяется: http://www.gotw.ca/gotw/081.htm И еще: http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/

5
ответ дан 24 November 2019 в 11:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: