2

我正在寻找一种简单的方法来将某些 g++(具体为 g++-4.9)编译选项本地化到某些代码行或至少是目标函数。一般来说,我感兴趣,但也特别对-fast-math,-ffinite-math-only-fno-signed-zeros选项感兴趣。

我认为使用make实用程序可以在 *.cpp 文件级别进行本地化,但我希望有一种方法可以通过 #pragma 或 __attribute__ 或其他方式在代码本身中启用它。我想这样做不仅是为了最大限度地减少对外部文件的依赖(即不正确的风险makefile),而且希望将某些 FP 行为超本地化到函数中的特定方程。

makefile或者,如果无法通过内联指令对 FP 行为进行本地化,如果在项目构建中未启用所需的编译器指令(例如丢失或不当修改),我可以做些什么来至少触发编译时错误。

我认为这种内联优化可能是编译器特定的,在这种情况下是 g++,但这是我愿意采取的折衷方案。

4

3 回答 3

6

gcc您可以使用函数属性 optimize

void f () __attribute__ ((optimize("fast-math"), optimize("finite-math-only"), optimize("no-signed-zeros")));
于 2015-08-28T16:26:47.157 回答
2

我不确定您是否正确使用了“本地化”一词。本地化与使软件适应不同人类语言(法语、俄语、中文...)的用户有关

也许您想要求编译器使用其他优化标志来优化某些功能。

这可以使用#pragma GCC optimizeetc... 或使用某些功能属性

于 2015-08-28T16:31:26.367 回答
1

您可能可以fpmath使用函数属性中的选项打开其中的某些位,但我从文档中不清楚这一点。鉴于此,我将专注于检测:

-fast-math已经打开-ffinite-math-only,所以你不必担心。文档-fast-math说:

此选项导致定义预处理器宏FAST_MATH

这意味着它可以通过

#ifndef __FAST_MATH__
#error "The -fast-math compiler option is required"
#endif

我还没有找到一种编译时方法来检测是否存在-fno-signed-zeros

于 2015-08-28T16:22:07.197 回答