为什么C++代码转换成不同的ASM代码?

为什么C++代码转换成不同的ASM代码?,c++,performance,visual-c++,optimization,assembly,C++,Performance,Visual C++,Optimization,Assembly,VisualC++,调试模式.< /P> 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 0

VisualC++,调试模式.< /P>
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);
或:


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

您正在查看的代码的输出是用调试开关设置生成的

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

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

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


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

如果您在调试模式下编译,那么编译器将不会进行优化,因此这是一个有点无意义的比较……理论上,应该没有区别,因为编译器无论如何都必须对其进行优化。实际上,这取决于编译器。谁告诉过你这两个代码是相等的,特别是在调试配置中,其中/Od没有应用优化。k>=0吗?true:false甚至有意义,为什么不直接使用k>=0@Vprimachenko没有意义,例如这段代码。
Foo((i>0)?(true):(false))