守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 899|回复: 0

[其他] 善于跟编译器学写代码

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51717
    钢镚
    1422

    开源英雄守望者

    发表于 2015-1-12 21:26:34 | 显示全部楼层 |阅读模式
    • 我如何学习写代码

    一直以来我都是从基础书本,从开源代码,从同事批评,从谷歌中改进自己”写代码”的技能.这里说的”写代码”,不是指具体的功能实现 函数调用,而是指一种编码习惯,例如命名习惯,留空习惯,注释习惯,等等在日常”写代码”中息息相关的片段.迄今为止我看过的没有那一本书(除了声名显赫的 code complete)教过我如何 跳出特定编程语言去写代码.这可能是我需要不断修炼的技能(去除特定的语法,语言,IDE,系统,最后程序员还剩下的东西 我估计那就是这里说的技能了.

    • 编译器如何写代码

    今天我发现了一直伴随我身边的伙伴 – “编译器”,写代码技术已经是修炼到登峰造极的地步了,他给我的感觉 无异于 少林寺的扫地僧,首先看一段代码

    1. // C/C++
    2. int for1(int n)
    3. {
    4.     int i = 0;
    5.     int s = 0;
    6.     for(i = 0;i<n;i++)
    7.     {
    8.         s += i*2;
    9.     }
    10.     return s;
    11. }
    复制代码

    我设想它最后会被编译成如下代码

    1. //参数判断
    2. CMP R0,#0
    3. BLE LOC_CD4
    4. //R0为函数传入参数
    5. MOV R2,R0
    6. //初始化局部变量
    7. MOV R3,#0
    8. MOV R0,R3
    9. //for 循环开始
    10. loc_CC0:
    11. // i = i<em>2
    12. MOV R3,R3,LSL#1
    13. // s += i</em>2
    14. ADD R0,R3
    15. //i++
    16. ADD R3,#1
    17. CMP R3,R2
    18. BNE loc_CC0
    19. BX LR
    20. loc_CD4:
    21. MOV R0,#0
    22. BX LR
    复制代码

    但是实际是被编译成如下:

    1. /参数判断
    2. CMP     R0, #0
    3. BLE     loc_CD4
    4. //初始化局部变量
    5. MOV     R3, #0
    6. //编译器优化开始
    7. //R2 = n*2
    8. MOV     R2, R0,LSL#1
    9. //初始化局部变量
    10. MOV     R0, R3
    11. loc_CC0:
    12. //s += i 没错.没有乘2
    13. ADD     R0, R0, R3
    14. //这里实现乘2
    15. ADD     R3, R3, #2
    16. CMP     R3, R2
    17. BNE     loc_CC0
    18. BX      LR
    19. loc_CD4:
    20. MOV     R0, #0
    21. BX      LR
    复制代码

    显然编译器在编译优化阶段 对for1函数进行的优化.在循环中减少了乘以2一句代码.
    如果这个for循环次数非常多的话 这个优化是非常明显的.
    我们根据编译器的优化 在写代码的时候可以把for1函数改进成如下:

    1. int for3(int n)
    2. {
    3.     int i = 0;
    4.     int s = 0;
    5.     n *= 2;
    6.     for(i = 0;i<n;i += 2)
    7.     {
    8.         s += i;
    9.     }
    10.     return s;
    11. }
    复制代码

    这个优化虽然不太明显.但是在运行代码的行数来说 减少了(n – 1)行.
    而我们知道 程序每执行一句代码,其实是需要时间的.


    本文来自:http://shadowkong.com/archives/1651
    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-9-15 13:33 , Processed in 0.043606 second(s), 37 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表