如何使用gcc预处理器宏__FAST_MATH__?

时间:2017-03-31 12:22:28

标签: math gcc optimization c-preprocessor

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倍。

2 个答案:

答案 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)

我相信你倒退了。定义宏是为了使标准库使用数学函数的不同实现。

自己定义它没有任何影响,实际上可能是危险的错误,因为当编译器没有生成预期的代码时,程序将使用这些替代实现。