免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4474 | 回复: 17
打印 上一主题 下一主题

if (NULL == pLogId)和if(pLogId==NULL)有什么区别? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-15 17:06 |只看该作者 |倒序浏览
if (NULL == pLogId)和if(pLogId==NULL)有什么区别?难道前面一个编译后运行更快?

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2009-07-15 17:45 |只看该作者
原帖由 liying_gg 于 2009-7-15 17:06 发表
if (NULL == pLogId)和if(pLogId==NULL)有什么区别?难道前面一个编译后运行更快?

没有什么区别,不过前一个如果把 == 误写为 = 的话,编译器会报错。虽然如此,前一种写法还是不应提倡,太别扭了。

论坛徽章:
0
3 [报告]
发表于 2009-07-15 17:50 |只看该作者

回复 #2 MMMIX 的帖子

我公司的代码都用的前一种方式,我还以为是编译后的汇编代码会执行快呢。
for循环也不一样,一般都是for(i=0;i<MAX;i++),我们代码都是for(i=MAX;i>=0;i--),不过这个for循环据说是后一种方式编译后执行快。

论坛徽章:
0
4 [报告]
发表于 2009-07-15 19:33 |只看该作者
眼拙了
这个for循环真看不出来什么门道

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
5 [报告]
发表于 2009-07-15 20:13 |只看该作者
原帖由 liying_gg 于 2009-7-15 17:50 发表
for循环也不一样,一般都是for(i=0;i=0;i--),不过这个for循环据说是后一种方式编译后执行快。

对于 C 来说,这两种在效率方面不存在差异(比较下最终生成的汇编就清楚了)。不过前一种更易读。

[ 本帖最后由 MMMIX 于 2009-7-15 20:15 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-07-15 21:45 |只看该作者

回复 #5 MMMIX 的帖子

对比了一下汇编后的结果,发现效率是一样的,而且linux内核中用的都是for(i=0;i<MAX;i++)这种写法。昨天看到一个哥们的帖子也提到这个问题,说后一种写法编译后运行效率高,又正好我们这边代码都用的后一种写法,所以误解了。
        .file   "a.c"
        .text
.globl main
        .type   main, @function
main:
        leal    4(%esp), %ecx
        andl    $-16, %esp
        pushl   -4(%ecx)
        pushl   %ebp
        movl    %esp, %ebp
        pushl   %ecx
        subl    $20, %esp
        movl    $0, -8(%ebp)
        jmp     .L2
.L3:
        addl    $1, -8(%ebp)
.L2:
        cmpl    $99, -8(%ebp)
        jle     .L3
        movl    $100, -8(%ebp)
        jmp     .L4
.L5:
        subl    $1, -8(%ebp)
.L4:
        cmpl    $0, -8(%ebp)
        jg      .L5
        addl    $20, %esp
        popl    %ecx
        popl    %ebp
        leal    -4(%ecx), %esp
        ret
        .size   main, .-main
        .ident  "GCC: (Ubuntu 4.3.2-1ubuntu11) 4.3.2"
        .section        .note.GNU-stack,"",@progbits

论坛徽章:
0
7 [报告]
发表于 2009-07-15 22:26 |只看该作者

回复 #6 liying_gg 的帖子

如果你用GCC编译的时候加了优化选项, 反汇编看到的结果可能会不一样.

说第二种for的写法更快, 其原因是:
第一种是将i与MAX比较, 每次比较需要CMP一次, 然后再判断标志位, 以便知道比较结果.
而第二种将i与0比较, CMP指令可能可以省略掉, 因为i--的时候, 如果i减为0, 标志位会自动被设置, 这时候比较i和0的话只需要直接看标志位就行了.

论坛徽章:
5
8 [报告]
发表于 2009-07-15 22:38 |只看该作者

回复 #7 kouu 的帖子

头晕了。不想弄明白。

论坛徽章:
0
9 [报告]
发表于 2009-07-15 22:48 |只看该作者

回复 #7 kouu 的帖子

原来这么回事儿啊,谢谢!

论坛徽章:
0
10 [报告]
发表于 2009-07-15 22:50 |只看该作者
就是防止错误
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP