Может ли const-правильность улучшить производительность? - PullRequest
73 голосов
/ 08 августа 2010

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

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

Ответы [ 4 ]

61 голосов
/ 08 августа 2010

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

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

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

19 голосов
/ 11 декабря 2016

Да, это возможно.

Большинство const s предназначены исключительно для пользы программиста и не помогают компилятору оптимизировать, потому что это законно, чтобы отбрасывать их, и поэтому они ничего не сообщают компиляторуполезно для оптимизации.Однако некоторые const не могут быть (законно) отброшены, и они предоставляют компилятору полезную информацию для оптимизации.

Например, доступ к глобальной переменной, определенной с типом 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 ... но реальные компиляторы не могут.

6 голосов
/ 08 августа 2010

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

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

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

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

5 голосов
/ 08 августа 2010

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

...