免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ethantsien
打印 上一主题 下一主题

[C] 一道题 --- 学C就要关注更底层的东西 [复制链接]

论坛徽章:
30
摩羯座
日期:2013-12-23 17:28:38牛市纪念徽章
日期:2015-07-13 11:35:582022北京冬奥会纪念版徽章
日期:2015-08-07 17:10:57青铜圣斗士
日期:2015-11-27 17:45:3815-16赛季CBA联赛之天津
日期:2016-02-15 13:44:3615-16赛季CBA联赛之江苏
日期:2018-05-02 16:56:2715-16赛季CBA联赛之辽宁
日期:2018-08-08 13:41:1015-16赛季CBA联赛之深圳
日期:2018-10-02 18:05:0315-16赛季CBA联赛之天津
日期:2019-05-31 15:05:0615-16赛季CBA联赛之北京
日期:2022-06-30 13:34:1115-16赛季CBA联赛之同曦
日期:2022-07-06 19:33:5415-16赛季CBA联赛之吉林
日期:2022-12-28 14:16:22
61 [报告]
发表于 2012-10-16 12:29 |只看该作者
这个问题挺无聊的,既然C标准规定是先判断条件那就这么写就行,编译器是别人开发的,操那么多心做什么,他犯错吃屎你也跟着吃啊

论坛徽章:
0
62 [报告]
发表于 2012-10-16 13:34 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
63 [报告]
发表于 2012-10-16 14:42 |只看该作者
siseniao 发表于 2012-10-16 12:29
这个问题挺无聊的,既然C标准规定是先判断条件那就这么写就行,编译器是别人开发的,操那么多心做什么,他犯 ...


如楼主提供的代码是真实的,还是有功劳的,直接发现了一个gcc的bug  

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
64 [报告]
发表于 2012-10-16 14:59 |只看该作者
cmov is a shit instrument...

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
65 [报告]
发表于 2012-10-16 16:29 |只看该作者
cmovcc亮了。流水线啊流水线。。。。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
66 [报告]
发表于 2012-10-17 00:35 |只看该作者
回复 54# lin5161678

对NULL这个东西别想那么多了,C里面就是(void*)0,C++里面就是0(新的C++已经引入nullptr),至于NULL是不是0,那已经是历史,虽然不排除未来某个偏歪的C实现又整个非0的NULL。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
67 [报告]
发表于 2012-10-17 00:42 |只看该作者
ethantsien 发表于 2012-10-16 09:35
gcc -march=i686


你见过哪个讲C标准的书把i686定义进去了?

另外,现代编译器也不是说都把这玩意整成cmov把。。。
bogon:~ weiwei$ cc -march=x86-64 -O3 -o ccc.S -S ccc.c
bogon:~ weiwei$ cat ccc.S
        .section        __TEXT,__text,regular,pure_instructions
        .globl        _foo
        .align        4, 0x90
_foo:                                   ## @foo
        .cfi_startproc
## BB#0:
        pushq        %rbp
Ltmp2:
        .cfi_def_cfa_offset 16
Ltmp3:
        .cfi_offset %rbp, -16
        movq        %rsp, %rbp
Ltmp4:
        .cfi_def_cfa_register %rbp
        testq        %rdi, %rdi
        jne        LBB0_2
## BB#1:
        xorl        %eax, %eax
        popq        %rbp
        ret
LBB0_2:
        movl        (%rdi), %eax
        popq        %rbp
        ret
        .cfi_endproc


.subsections_via_symbols
bogon:~ weiwei$ cc -v
Apple clang version 4.1 (tags/Apple/clang-421.11.65) (based on LLVM 3.1svn)
Target: x86_64-apple-darwin12.2.0
Thread model: posix

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
68 [报告]
发表于 2012-10-17 10:11 |只看该作者
回复 53# ethantsien


    MinGW 4.7.2 -march=i686试过了,-O0到-O3都是je……木有被编译成cmov神马的……

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
69 [报告]
发表于 2012-10-17 11:56 |只看该作者
回复 68# starwing83


    哦. 这么说, 一开始我还以为LZ居然发现了个编译器实现的错误, 现在看来编译器是不会犯这种错误的. 如果有, 大约GCC会说明“注意在此优化条件下, gcc有理由悍然违背C标准语义...”

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
70 [报告]
发表于 2012-10-17 12:37 |只看该作者
#gcc -march=x86-64 -O3 -S a.c -o a.s

cat a.s:
  1.         .file        "a.c"
  2.         .text
  3.         .p2align 4,,15
  4. .globl foo
  5.         .type        foo, @function
  6. foo:
  7. .LFB0:
  8.         .cfi_startproc
  9.         xorl        %eax, %eax
  10.         testq        %rdi, %rdi
  11.         je        .L3
  12.         movl        (%rdi), %eax
  13. .L3:
  14.         rep
  15.         ret
  16.         .cfi_endproc
  17. .LFE0:
  18.         .size        foo, .-foo
  19.         .ident        "GCC: (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3"
  20.         .section        .note.GNU-stack,"",@progbits
复制代码
嗯, x86-64寄存器多了很多, 这函数连栈帧都不用建的.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP