-3

Visual c++,调试模式。

if(k>=0)

011D14CE  cmp         dword ptr [k],0  
011D14D2  jl          bez+28h (11D14D8h)  

return true;

011D14D4  mov         al,1  
011D14D6  jmp         bez+33h (11D14E3h)  

return false;
011D14D8  xor         al,al  
011D14DA  jmp         bez+33h (11D14E3h)  

和相等的代码:

return (k>=0)?(true):(false);
011D14DC  cmp         dword ptr [k],0  
011D14E0  setge       al  

什么更快?当我在函数调用中使用第二个构造时更快的是什么?

if(i>0)
    Foo(true);
else
    Foo(false);

或者:

Foo((i>0)?(true):(false))

?

4

2 回答 2

10

在调试模式下编译时,该代码不相等。在第一个版本中,您可以在return true分支上设置断点。这不能用setge al.

于 2012-06-30T17:45:19.560 回答
1

您正在查看的代码的输出是使用调试开关设置构建的。

编译器为每一行源代码创建代码,以便或多或少地进行调试和源代码跟踪。

一个实例有 4 行代码。一个实例有一行代码。编译器相应地输出代码。

但是,您不会使用调试代码进入生产环境。您将使用优化构建代码。

如果您使用优化编译这两个实例,我将看到完全相同的代码。

于 2012-06-30T17:54:15.553 回答