Эффективность повторной арифметики между двумя макросами - PullRequest
0 голосов
/ 23 февраля 2011

В проекте ANSI C, над которым я работаю, определены два макроса: PERIOD_IN_MS и CYCLES_PER_MS.В реальной логике обработки периода я делаю много сравнений между счетчиком, который увеличивается с каждым циклом и PERIOD_IN_MS * CYCLES_PER_MS.Меня беспокоит, что эта арифметическая операция неоднократно оценивается во время каждого сравнения.

Кто-нибудь знает, верно ли это, или компилятор будет оценивать произведение двух целочисленных литералов во время компиляции и использовать его вместо этого?

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

Ответы [ 3 ]

6 голосов
/ 23 февраля 2011

Стандарт не предъявляет никаких требований для этого, но любой разумный компилятор сворачивает эти константы в единицу во время компиляции.См., Например, http://en.wikipedia.org/wiki/Constant_propagation.

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

2 голосов
/ 23 февраля 2011

Компилятор должен (но я считаю, что в C это не обязательно) оценивать константное выражение во время компиляции. Хороший компилятор почти наверняка сделает это, когда оптимизация включена.

0 голосов
/ 23 февраля 2011

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

enum { cycles_per_period = PERIOD_IN_MS * CYCLES_PER_MS};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...