GCC编译时浮点优化

时间:2012-02-12 07:04:59

标签: c optimization gcc floating-point avr

我正在为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 个答案:

答案 0 :(得分:3)

如果您将位作为数字文字提供,GCC应始终进行常量折叠。 如果你希望编译器强制执行constness,你可以逃避这样的事情:

#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)))

答案 1 :(得分:2)

一般来说,我认为gcc -O2将在编译时对常量进行所有算术运算 它不会将其转换为整数运算 - 只是一个常数整数。

依赖可能是危险的,特别是如果其他人维护代码。将非常量参数传递给宏导致错误的情况并不好。