【发布时间】:2019-06-11 19:20:29
【问题描述】:
在编译我的代码时,我通过使用此选项获得了巨大的加速。从手册页上说这个选项:
在调用执行的数学函数后不要设置“errno” 使用单个指令,例如“sqrt”
我不清楚 'errno' 是什么,以及它如何在其他地方使用(这与程序的退出代码相同吗?)此外,手册页说:
依赖 IEEE 异常来处理数学错误的程序可能 希望在保持 IEEE 算法的同时使用此标志来提高速度 兼容性。
我不清楚这意味着什么,是 c++ 的 IEEE 异常标准还是 c++ 的通用库(例如 Eigen、Boost 等)
基本上,我正在尝试确定这是否是在我的代码中使用的“安全”选项,或者我应该从它的使用中注意哪些副作用。 previous answer 说这可能会影响“线程局部变量”,但我不知道这意味着什么。
编辑:我的代码是一个简单的一次性程序代码,用于处理科学问题。它不会成为需要复杂错误处理的深度嵌入式系统的一部分。但是,代码不能以微妙、无声的方式失败。
【问题讨论】:
-
许多标准数学函数在错误上设置
errno。禁用它允许更简单、更优化的代码路径,但代价是更难检测错误。 -
@Shawn 看起来不错的答案
-
使用
-fno-math-errno的数学函数等效于使用[[gnu::const]]声明的函数function attribute。这大大改善了优化。 -
@LightnessRacesinOrbit 也许你高估了优化器:demo.