man gcc(1)说:选项-ffast-math导致预处理器宏__FAST_MATH__被定义。那个宏还有进一步的文档吗?
我希望代码像
#define __FAST_MATH__ blabla
y = pow(x,a);
#undef __FAST_MATH__
允许控制数学优化,精细化为单个语句。
但是,我的测试反而表明
#define __FAST_MATH__
#define __FAST_MATH__ on
都被忽略,无论它们放在何处。
[编辑]即使将放在
之前,它们也会被忽略#include <math.h>
&#34;忽略&#34;意思是:没有可衡量的影响。而-ffast-math将我的测试代码加速了3倍。
答案 0 :(得分:3)
-ffast-math
导致定义了预处理程序宏__FAST_MATH__
。
这只是功能测试宏,即您可以根据是否指定-ffast-math
使用条件编译:
#if defined (__FAST_MATH__)
/* Code to use with -ffast-math. */
#else
/* Code to use with -fno-fast-math. */
#endif /* -ffast-math ? */
在大多数情况下,您不需要条件编译,但是如果需要,则可以使用宏,并且无需在代码中或在命令行上按-D
对其进行定义。
此外,某些{system}标头可能依赖于它,并且在-ffast-math
启用的情况下使用更快的代码。
更常见的此类宏是__OPTIMIZE__
和__OPTIMIZE_SIZE__
。如果启用了优化功能,则定义前者,例如(-Og
,-O1
,-O2
,-Os
,...),后者则是针对{{1 }}。
注意:只有在将-Os
作为multilib选项引入时,才能在标准库中使用这些选项,以便指定它可以链接libc的不同版本, libm,libstdc ++等,例如-ffast-math
/ -m32
。您可以使用-m64
显示多库布局,这会在我的x86_64上显示:
gcc -print-multi-lib
这意味着我们有2个变体,一个是默认变体,另一个是用.;
32;@m32
选择的。
答案 1 :(得分:1)
我相信你倒退了。定义宏是为了使标准库使用数学函数的不同实现。
自己定义它没有任何影响,实际上可能是危险的错误,因为当编译器没有生成预期的代码时,程序将使用这些替代实现。