我们有一些像这样的代码:
inline int calc_something(double x) {
if (x > 0.0) {
// do something
return 1;
} else {
// do something else
return 0;
}
}
很不幸,在使用标志/fp:fast
时,我们得到了calc_something(0)==1
,因此我们显然走了错误的代码路径。只有在我们在代码中多个位置使用不同参数使用该方法时,才会出现这种情况,因此我认为编译器(Microsoft Visual Studio 2008,SP1)进行了一些可疑的优化。
另外,当我们将接口更改为以下内容时,上述问题就会消失:
inline int calc_something(const double& x) {
但我不知道为什么这会修复奇怪的行为。有人能解释一下这种行为吗?如果我无法理解发生了什么,我们将不得不移除/fp:fast
开关,但这将使我们的应用程序变慢相当多。
calc_something
的调用吗? - fredoverflowint x = calc_something(0.0);
。 - martinusfp:fast
的权威MSDN文章。(2)通常情况下,不要在任何第三方源代码上启用fp:fast
。如果它是安全的,那么启用它应该由他们来完成,而不是你。 (3)通常情况下,在整个项目中启用它是没有意义的;正确的用法是在程序员可以验证算法准确性、生成的机器指令和性能增益影响的小代码段中选择性地启用它。 - rwong