Объявление переменных C ++ const помогает или снижает производительность? - PullRequest
7 голосов
/ 05 октября 2010

Я понимаю поведение 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 ]

23 голосов
/ 05 октября 2010

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

3 голосов
/ 12 октября 2010

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

2 голосов
/ 05 октября 2010

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

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

1 голос
/ 05 октября 2010

Хотя технически ответ «да», практический ответ - НЕТ.Это правда, что компилятор может при определенных обстоятельствах выполнять оптимизацию кода, принимая во внимание, что данное значение не может измениться или что метод не изменит владелец-объект.Тем не менее, это будут ситуативные случаи и настолько невероятно далеко заросли оптимизации, что почти наверняка было бы ошибкой принять это во внимание заранее.

0 голосов
/ 05 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...