c++ - "if if"与 "if else if"的性能差异

标签 c++ c

我只是在想 C/C++ 中的 2 个语句之间是否存在性能差异:

案例一:

if (p==0)
   do_this();
else if (p==1)
   do_that();
else if (p==2)
   do_these():

案例 2:

if(p==0)
    do_this();
if(p==1)
    do_that();
if(p==2)
    do_these();

最佳答案

假设简单类型(在这种情况下,我使用了 int)并且没有有趣的事情(没有为 int 重新定义 operator=),至少与 AMD64 上的 GCC 4.6 没有区别。生成的代码是一样的:

0000000000000000 <case_1>:                                   0000000000000040 <case_2>:
   0:   85 ff                   test   %edi,%edi               40:   85 ff                   test   %edi,%edi
   2:   74 14                   je     18 <case_1+0x18>        42:   74 14                   je     58 <case_2+0x18>
   4:   83 ff 01                cmp    $0x1,%edi               44:   83 ff 01                cmp    $0x1,%edi
   7:   74 27                   je     30 <case_1+0x30>        47:   74 27                   je     70 <case_2+0x30>
   9:   83 ff 02                cmp    $0x2,%edi               49:   83 ff 02                cmp    $0x2,%edi
   c:   74 12                   je     20 <case_1+0x20>        4c:   74 12                   je     60 <case_2+0x20>
   e:   66 90                   xchg   %ax,%ax                 4e:   66 90                   xchg   %ax,%ax
  10:   f3 c3                   repz retq                      50:   f3 c3                   repz retq 
  12:   66 0f 1f 44 00 00       nopw   0x0(%rax,%rax,1)        52:   66 0f 1f 44 00 00       nopw   0x0(%rax,%rax,1)
  18:   31 c0                   xor    %eax,%eax               58:   31 c0                   xor    %eax,%eax
  1a:   e9 00 00 00 00          jmpq   1f <case_1+0x1f>        5a:   e9 00 00 00 00          jmpq   5f <case_2+0x1f>
  1f:   90                      nop                            5f:   90                      nop
  20:   31 c0                   xor    %eax,%eax               60:   31 c0                   xor    %eax,%eax
  22:   e9 00 00 00 00          jmpq   27 <case_1+0x27>        62:   e9 00 00 00 00          jmpq   67 <case_2+0x27>
  27:   66 0f 1f 84 00 00 00    nopw   0x0(%rax,%rax,1)        67:   66 0f 1f 84 00 00 00    nopw   0x0(%rax,%rax,1)
  2e:   00 00                                                  6e:   00 00 
  30:   31 c0                   xor    %eax,%eax               70:   31 c0                   xor    %eax,%eax
  32:   e9 00 00 00 00          jmpq   37 <case_1+0x37>        72:   e9 00 00 00 00          jmpq   77 <case_2+0x37>
  37:   66 0f 1f 84 00 00 00    nopw   0x0(%rax,%rax,1)
  3e:   00 00 

case_1 末尾的额外指令仅用于 padding (to get the next function aligned) .

这并不奇怪,确定 p 在该函数中没有改变是相当基本的优化。如果 p 可以更改(例如,通过引用传递或指向各种 do_... 函数的指针,或者本身是引用或指针,因此可能存在别名),则行为不同,当然生成的代码也是如此。

关于c++ - "if if"与 "if else if"的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7970275/

相关文章:

c++ - AES 和 key 长度错误

c++ - 压缩库 Windows 运行时

c++ - 如何从提供的日志中收集相关信息?

c++ - NSString UTF8String 访问错误

c - C代码的输出

c - 使用 autotools 时原始 .h 文件会发生什么情况?

c++ - 将打包的半字节组合成打包的字节

无法理解为什么一行最多可以有 MAX_LINE/2 个单词

c - 如何解决以下代码中的逻辑错误

c - 为什么这会给我一个逻辑错误?