为什么C++代码转换成不同的ASM代码?
VisualC++,调试模式.< /P>为什么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
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))