GCC оптимизация с плавающей точкой во время компиляции - PullRequest
5 голосов
/ 12 февраля 2012

Я занимаюсь разработкой для платформы AVR, и у меня есть вопрос. Я не хочу, чтобы библиотека с плавающей запятой была связана с моим кодом, но мне нравится концепция наличия аналоговых значений в диапазоне 0,0 ... 1,0 вместо 0 ... 255 и 0 ... 1023, в зависимости от четности использую ли я порт в качестве входа или выхода.

Поэтому я решил умножить аргументы функций ввода / вывода на 1023.0 и 255.0 соответственно. Теперь мой вопрос: если я реализую разделение следующим образом:

#define analog_out(port, bit) _analog_out(port, ((uint8_t)((bit) * 255.0)))

Будет ли GCC (с включенным флагом -O3) оптимизировать умножения с плавающей запятой во время компиляции, известные во время компиляции и приведенные к целочисленному типу, в целочисленные операции? (Я знаю, что при использовании этих макросов с непостоянными аргументами оптимизация невозможна; я просто хочу знать, будет ли это сделано в другом случае.)

Ответы [ 2 ]

3 голосов
/ 13 февраля 2012

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

#define force_const(x) (__builtin_choose_expr(__builtin_constant_p(x), (x), (void)0))
#define analog_out(port, bit) _analog_out(port, force_const((uint8_t)((bit) * 255.0)))
2 голосов
/ 12 февраля 2012

Как правило, я думаю, gcc -O2 выполнит всю арифметику с константами во время компиляции.
Она не преобразует ее в целочисленную арифметику - просто в константу.

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

...