Объявление переменных c++ const помогает или вредит производительности?

Я понимаю поведение const-квалифицированные виды данных. Мне любопытно, однако, если есть какой - либо прирост производительности или потеря от чрезмерного или недостаточного усердия квалификационных переменных как const. Я имею в виду, в частности, переменные, объявленные и используемые исключительно в изолированном блоке кода. Например, что-то вроде:

const qreal padding = CalculatePadding();
const QSizeF page_size = CalculatePagePreviewSize(padding);
const QRectF content_rect = CalculatePagePreviewContentRect(page_size);
const QList<QRectF> pages = renderer.BuildPrintPages(printer_, map_scene_);
const QFont page_number_font = CalculatePageNumberFont();
const QFontMetrics metrics(page_number_font);

предположим, мне нужно только const - квалифицированные методы на всех этих (и более.) Есть ли какой-либо прирост производительности в объявлении их всех const? Или, наоборот, это действительно вредит производительности?

мне любопытно как производительность во время выполнения (я предполагаю, что это не имеет значения, как const является исключительно проверкой времени компиляции-может ли кто-нибудь подтвердить?) и производительность во время компиляции. У меня недостаточно опыта работы с c++, чтобы почувствовать это, и мне интересно, должен ли я ошибаться на стороне чрезмерного или недостаточного применения const когда все остальное (ремонтопригодность и т. д.) равны.

5 ответов


const в основном это время компиляции, однако, объявляя что-то как const иногда допускает определенные оптимизации. Если рассматриваемый код не является узким местом производительности, я бы не беспокоился об этом и просто использовал const как и предполагалось: для создания более четкого кода и предотвращения глупых вещей.


Я понимаю, что const может использоваться компилятором для потенциальной оптимизации производительности, но не является гарантией этого; однако не должно быть снижения производительности. Это может потенциально повлиять на поведение среды выполнения (т. е. компилятор может поместить переменные const на страницы памяти только для чтения).

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


в моем (ограниченном) опыте const может повредить производительность довольно много (сюрприз!) А именно, при работе с классами контейнеров будьте осторожны, что делает cont-ness: для массивов он может просто заставить компилятор создать копию вашего контейнера (например, массива), как только один элемент будет доступен только для чтения... Это была огромная боль, чтобы найти в коде, над которым я работаю.


хотя технически ответ "да", практический ответ-нет. Это правда, что компилятор может при определенных обстоятельствах выполнять оптимизацию кода, принимая во внимание, что данное значение не может измениться или что метод не будет изменять объект-владелец. Однако это будут ситуационные случаи и настолько невероятно глубоко в сорняках оптимизации, что было бы почти наверняка ошибкой принимать это во внимание заранее.


const просто там, чтобы помочь вам поймать ошибки во время компиляции. Однако, поскольку есть эта вещь, называемая const_cast вы всегда можете изменить константу любой переменной, чтобы компилятор действительно не мог ничего оптимизировать. (Вы также можете весело провести время с C-style casts, чтобы избавиться от constness, который может сделать оптимизацию недействительной.)