社区
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;那个快?
...全文
142
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
打赏
举报
回复
一样快。
1399043357-59574.rar
1399043357-59574.rar
软件项目项目特点及实施要求分析.doc
软件项目项目特点及实施要求分析.doc
jdbc配置文件黑麦java 建表语句
jdbc配置文件黑麦java
浅析软件项目时间管理.doc
浅析软件项目时间管理.doc
项目管理规划大纲编制范本.docx
项目管理规划大纲编制范本.docx
C语言
70,020
社区成员
243,265
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章