为什么相等的c ++代码转换为不同的asm代码?

时间:2012-06-30 17:38:26

标签: c++ performance visual-c++ optimization assembly

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

2 个答案:

答案 0 :(得分:10)

在调试模式下编译时,该代码不相等。在第一个版本中,您可以在return true分支上设置断点。 setge al无法完成此操作。

答案 1 :(得分:1)

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

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

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

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

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