c=(a==b)?a:b;和if(a==b) c=a; else c=b;那个快?

youthbcg 2005-04-10 07:20:19
c=(a==b)?a:b;和if(a==b) c=a; else c=b;那个快?
...全文
142 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zengwujun 2005-04-10
  • 打赏
  • 举报
回复
//看下面的汇编代码
c=(a==b)?a:b;
00401096 mov eax,dword ptr [ebp-4]
00401099 cmp eax,dword ptr [ebp-8]
0040109C jne main+36h (004010a6)
0040109E mov ecx,dword ptr [ebp-4]
004010A1 mov dword ptr [ebp-10h],ecx
004010A4 jmp main+3Ch (004010ac)
004010A6 mov edx,dword ptr [ebp-8]
004010A9 mov dword ptr [ebp-10h],edx
004010AC mov eax,dword ptr [ebp-10h]
004010AF mov dword ptr [ebp-0Ch],eax
810:
811: if(a==b)
004010B2 mov ecx,dword ptr [ebp-4]
004010B5 cmp ecx,dword ptr [ebp-8]
004010B8 jne main+52h (004010c2)
812: c=a;
004010BA mov edx,dword ptr [ebp-4]
004010BD mov dword ptr [ebp-0Ch],edx
813: else
004010C0 jmp main+58h (004010c8)
814: c=b;
004010C2 mov eax,dword ptr [ebp-8]
004010C5 mov dword ptr [ebp-0Ch],eax

//如果只考虑a!=b
c=(a==b)?a:b;
00401096 mov eax,dword ptr [ebp-4]//a进eax
00401099 cmp eax,dword ptr [ebp-8]//比较
0040109C jne main+36h (004010a6)//跳转进行a!=b处理
004010A6 mov edx,dword ptr [ebp-8]//b进edx
004010A9 mov dword ptr [ebp-10h],edx//把b赋给一个临时变量
004010AC mov eax,dword ptr [ebp-10h]//这个变量eax
004010AF mov dword ptr [ebp-0Ch],eax//c=这个变量

811: if(a==b)
004010B2 mov ecx,dword ptr [ebp-4]
004010B5 cmp ecx,dword ptr [ebp-8]
004010B8 jne main+52h (004010c2)
814: c=b;
004010C2 mov eax,dword ptr [ebp-8]//b进eax
004010C5 mov dword ptr [ebp-0Ch],eax//c=b;

所以说,c=(a==b)?a:b;会多产生一个临时变量,速度稍慢.
不知是否正确,请大侠指点
晨星 2005-04-10
  • 打赏
  • 举报
回复
不过这可能是个跟编译器有关的问题。
晨星 2005-04-10
  • 打赏
  • 举报
回复
哦,不对,前者可能临时变量存放表达式“(a==b)?a:b”的值,然后把临时变量的值赋给c,所以应该是后者快;

以下是VC6Debug版本产生的汇编代码。
14: c = (a == b) ? a : b;
00401052 mov eax,dword ptr [ebp-4]
00401055 cmp eax,dword ptr [ebp-8]
00401058 jne main+52h (00401062)
0040105A mov ecx,dword ptr [ebp-4]
0040105D mov dword ptr [ebp-1Ch],ecx
00401060 jmp main+58h (00401068)
00401062 mov edx,dword ptr [ebp-8] ;这两句把表达式的值放临时变量。
00401065 mov dword ptr [ebp-1Ch],edx
00401068 mov eax,dword ptr [ebp-1Ch] ;这两句把临时变量赋给c。
0040106B mov dword ptr [ebp-0Ch],eax
15: if(d == e)
0040106E mov ecx,dword ptr [ebp-10h]
00401071 cmp ecx,dword ptr [ebp-14h]
00401074 jne main+6Eh (0040107e)
16: f = d;
00401076 mov edx,dword ptr [ebp-10h]
00401079 mov dword ptr [ebp-18h],edx
17: else
0040107C jmp main+74h (00401084)
18: f = e;
0040107E mov eax,dword ptr [ebp-14h]
00401081 mov dword ptr [ebp-18h],eax
pcboyxhy 2005-04-10
  • 打赏
  • 举报
回复
要不要考虑CPU的指令流水线呢?
avalonBBS 2005-04-10
  • 打赏
  • 举报
回复
(a==b)?c=a:c=b;
ysbcg 2005-04-10
  • 打赏
  • 举报
回复
c=(a==b)?a:b;
mov eax,a
cmp eax,b
jne _st1
mov ecx,a
mov _tmp,ecx
jmp _st2
_st1:
mov edx,b
mov _tmp,edx
_st2:
mov eax,_tmp
mov c,eax




if(a==b) {
mov ecx,a
cmp ecx,b
jne _st3
c=a;
mov edx,a
mov c,edx
} else c=b;
jmp _st4
_st3:
mov eax,b
mov c,eax
_st4:

第一个多了一个_tmp步骤
heroboy2000 2005-04-10
  • 打赏
  • 举报
回复
不知道
关键在于编译器的优化
晨星 2005-04-10
  • 打赏
  • 举报
回复
一样快。

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧