社区
C语言
帖子详情
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;那个快?
...全文
146
8
打赏
收藏
c=(a==b)?a:b;和if(a==b) c=a; else c=b;那个快?
c=(a==b)?a:b;和if(a==b) c=a; else c=b;那个快?
复制链接
扫一扫
分享
转发到动态
举报
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
打赏
举报
回复
一样快。
licensemanagerusersubscriptions-jvm-1.3.49-javadoc.jar
licensemanagerusersubscriptions-jvm-1.3.49-javadoc.jar
Delphi 13控件之ProjectCode.zip
Delphi 13控件之ProjectCode.zip
lakeformation-jvm-1.3.108-sources.jar
lakeformation-jvm-1.3.108-sources.jar
robomaker-jvm-0.17.9-beta.jar
robomaker-jvm-0.17.9-beta.jar
opensearch-1.1.16-javadoc.jar
opensearch-1.1.16-javadoc.jar
C语言
70,026
社区成员
243,245
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章