Я много раз читал, что обеспечение константной корректности в вашем коде C или C ++ - это не только хорошая практика с точки зрения ремонтопригодности, но также может позволить вашему компилятору выполнять оптимизацию. Однако я также читал полную противоположность - это вообще не влияет на производительность.
Поэтому есть ли у вас примеры, когда корректность констант может помочь вашему компилятору улучшить производительность вашей программы?
c++
performance
const-correctness
шухало
источник
источник
const
разницы в производительности: stackoverflow.com/questions/1121791/… . Однако по сути это была проблема качества реализации.const
не определить , является ли компилятор может законно сделать оптимизацию, просто так получилось , что версия компилятора не в состоянии сделать это , когда он отсутствовал.Ответы:
const
правильность не может улучшить производительность, потому чтоconst_cast
иmutable
находятся на языке, и позволяют коду соответствующим образом нарушать правила. Это становится еще хуже в C ++ 11, где вашиconst
данные могут, например, быть указателем на astd::atomic
, что означает, что компилятор должен учитывать изменения, сделанные другими потоками.Тем не менее, для компилятора тривиально посмотреть на генерируемый им код и определить, действительно ли он пишет в заданную переменную, и соответственно применить оптимизацию.
Тем не менее,
const
правильность - это хорошо с точки зрения ремонтопригодности. В противном случае клиенты вашего класса могут сломать внутренние члены этого класса. Например, рассмотрим стандартныйstd::string::c_str()
- если он не может вернуть константное значение, вы сможете поиграть с внутренним буфером строки!Не используйте
const
по соображениям производительности. Используйте его из соображений ремонтопригодности.источник
const
это указатели, говорящие: «Вы делаете что-то глупое».Да, оно может.
Большинство
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; }
как м:
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
... но настоящие компиляторы не могут.источник
по моему опыту нет
Для скалярных переменных компилятор может определять, когда значение изменяется, и самостоятельно выполнять необходимую оптимизацию.
Для указателей на массивы правильность констант не гарантирует, что значения действительно постоянны при наличии потенциальных проблем с псевдонимом. Следовательно, компилятор не может использовать модификатор const только для выполнения оптимизаций.
если вы ищете оптимизацию, вам следует рассмотреть
__restrict__
или специальные модификаторы функций / атрибуты: http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.htmlисточник
Немного устарел, но все еще применяется: http://www.gotw.ca/gotw/081.htm И еще несколько: http://cpp-next.com/archive/2009/08/want-speed-pass-by -значение/
источник