gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:46:30 26 4
gpt4 key购买 nike

我只是在想 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com