【问题标题】:Why equal c++ code transform to different asm code?为什么等于 c++ 代码转换为不同的 asm 代码?
【发布时间】:2012-06-30 17:38:26
【问题描述】:

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

?

【问题讨论】:

  • 如果你在调试模式下编译,那么编译器不会进行优化,所以这是一个毫无意义的比较......
  • 理论上应该没有区别,因为无论如何编译器都必须对其进行优化。在实践中,这取决于编译器。
  • 谁告诉你两个代码是相等的,尤其是在调试配置中,应用了/Od(没有优化)。
  • (k>=0)?(true):(false) 是否有意义,为什么不简单地使用k>=0
  • @Vprimachenko 没有意义,例如这段代码。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-02-08
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多