GCC编译时浮点优化

5 c floating-point optimization gcc 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)))
Run Code Online (Sandbox Code Playgroud)

将GCC(打开-O3标志)优化编译时浮点乘法(在编译时已知并转换为整数类型)进行整数运算?(我知道当使用带有非常量参数的这些宏时,优化是不可能的;我只是想知道它是否会在另一种情况下完成.)

fnl*_*fnl 3

如果您将 bit 作为数字文字提供,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)))
Run Code Online (Sandbox Code Playgroud)