`
jonson
  • 浏览: 170893 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

编程谏言3

阅读更多
  alan谏言3:Syntactic sugar causes cancer of the semicolon. 语法糖衣导致了代码的弊病。
   语法糖衣是由Peter J. Landin创造的一个术语,是指用在一门语言中,用该语言语法包装程序,使程序语句更适合于人类的思维方式。它使得程序员使用该语言起来更舒适。特别来说,对于某个语言中的某个控件是可以由语言的其它语法来替换,并且不对完成的功能有任何的影响。举个语法糖衣的例子:
   在C语言中,对数组的访问,我们可以同  array[i]这种下标的方式来访问,但是其实这是一个语法糖衣,可以通过 *(array + i)来访问。
   语法糖衣是对原有指令等的包装,但是是否因此就增加了代码出现问题的概率。还不得而知。
1
0
分享到:
评论
7 楼 RednaxelaFX 2009-12-30  
实现编译器的时候,arr[i]比*(arr + i)可以保持更多高级语义,因而可以更方便的支持指针别名分析,所以在现在的优化编译器里反而是前者更容易被优化。
GCC在-O0为*(arr + i)生成了独立的 取偏移量-取基地址-加-移动 的指令序列的罪魁祸首不知道是不是指令选取的步骤,因为这个序列形成的模式完全可以在指令选取时被合并为一条base + scale*offset的寻址模式的指令……求验证。

当然我们完全可以把base + scale*offset的寻址都用下标方式写……也怪怪的。总之怎么用看起来自然就怎么用总没错的。

6 楼 mikeandmore 2009-12-30  
jinleileiking 写道
mikeandmore 写道
jinleileiking 写道
array[i] 和 *(array + i)

效率上*理论会快点,但是大多数场合,这两个差不多。

记得是前者会快,因为前者大部分编译器会做优化,而后者的语法树比较复杂,很难优化。

要看编译器,我见过的编译器:

KEIL, IAR,都会自动优化。我在项目中做过实验,验证过。。。该死的性能。。。

也许比较老的不会自动优化吧。。ls有什么经验?分享一下。

-O0的时候的确没有*(arr+i)的确没有

*(arr+i)
 80484dd:       8b 84 24 bc 0f 00 00    mov    0xfbc(%esp),%eax                 
 80484e4:       8d 14 85 00 00 00 00    lea    0x0(,%eax,4),%edx                
 80484eb:       8d 44 24 1c             lea    0x1c(%esp),%eax                  
 80484ef:       01 d0                   add    %edx,%eax                        
 80484f1:       8b 00                   mov    (%eax),%eax                      
 80484f3:       89 44 24 04             mov    %eax,0x4(%esp)                   
 80484f7:       c7 04 24 f0 85 04 08    movl   $0x80485f0,(%esp)                
 80484fe:       e8 ed fe ff ff          call   80483f0 <printf@plt>             
 8048503:       83 84 24 bc 0f 00 00    addl   $0x1,0xfbc(%esp)                 
 804850a:       01                                                              
 804850b:       81 bc 24 bc 0f 00 00    cmpl   $0x3e7,0xfbc(%esp)               
 8048512:       e7 03 00 00                                                     
 8048516:       0f 9e c0                setle  %al                              
 8048519:       84 c0                   test   %al,%al                          
 804851b:       75 c0                   jne    80484dd <main+0x19>

arr[i]
 80484dd:       8b 84 24 bc 0f 00 00    mov    0xfbc(%esp),%eax                 
 80484e4:       8b 44 84 1c             mov    0x1c(%esp,%eax,4),%eax           
 80484e8:       89 44 24 04             mov    %eax,0x4(%esp)                   
 80484ec:       c7 04 24 e0 85 04 08    movl   $0x80485e0,(%esp)                
 80484f3:       e8 f8 fe ff ff          call   80483f0 <printf@plt>             
 80484f8:       83 84 24 bc 0f 00 00    addl   $0x1,0xfbc(%esp)                 
 80484ff:       01                                                              
 8048500:       81 bc 24 bc 0f 00 00    cmpl   $0x3e7,0xfbc(%esp)               
 8048507:       e7 03 00 00                                                     
 804850b:       0f 9e c0                setle  %al                              
 804850e:       84 c0                   test   %al,%al                          
 8048510:       75 cb                   jne    80484dd <main+0x19>              
 


-O3就都有了
5 楼 幸存者 2009-12-29  
mikeandmore 写道
jinleileiking 写道
array[i] 和 *(array + i)

效率上*理论会快点,但是大多数场合,这两个差不多。

记得是前者会快,因为前者大部分编译器会做优化,而后者的语法树比较复杂,很难优化。

我很有兴趣知道前者究竟会优化成什么样以致于比后者快?
4 楼 jinleileiking 2009-12-29  
mikeandmore 写道
jinleileiking 写道
array[i] 和 *(array + i)

效率上*理论会快点,但是大多数场合,这两个差不多。

记得是前者会快,因为前者大部分编译器会做优化,而后者的语法树比较复杂,很难优化。

要看编译器,我见过的编译器:

KEIL, IAR,都会自动优化。我在项目中做过实验,验证过。。。该死的性能。。。

也许比较老的不会自动优化吧。。ls有什么经验?分享一下。
3 楼 mikeandmore 2009-12-09  
jinleileiking 写道
array[i] 和 *(array + i)

效率上*理论会快点,但是大多数场合,这两个差不多。

记得是前者会快,因为前者大部分编译器会做优化,而后者的语法树比较复杂,很难优化。
2 楼 smiletuna 2009-12-08  
jinleileiking 写道
array[i] 和 *(array + i)

效率上*理论会快点,但是大多数场合,这两个差不多。



现在的编译器 能自动优化这种代码了。 毕竟前者可读性更好些。
1 楼 jinleileiking 2009-12-07  
array[i] 和 *(array + i)

效率上*理论会快点,但是大多数场合,这两个差不多。

相关推荐

    编程高手箴言(梁肇新)

    是一本不可多得的编程的灯塔,对我们这些想成为编程高手的人很有指导意义

    程序员请在编程中别自作聪明

    程序员请在编程中别自作聪明.人人都有很高的欲望在编程中表现自己的聪明。你想卖弄一下,用你高超的技巧写出一段最奇巧的代码。它让你得到少有的成就感。...所以,下面有一些对年轻程序员的谏言:在你的个人项目,

    编程中别卖弄,那是自作聪明

    编程中别卖弄,那是自作聪明!人人都有很高的欲望在编程中表现自己的聪明。你想卖弄一下,用你高超的技巧写出一段最奇巧的代码。它让你得到少有的成就感。...所以,下面有一些对年轻程序员的谏言:在你的个人项目,

    [甫,字子美,京兆人。少贫不自振hehe文] 甫字子美少贫不自振.docx

    4. **君臣关系与谏言**:杜甫上疏皇帝,表示自己愿意为国家效力,希望皇帝不要放弃他这样的臣子,这反映了古代文人士大夫对君主的忠诚以及敢于直谏的精神。 5. **个人生活困境**:杜甫家境贫寒,甚至有家人饿死,这...

    scratch少儿编程逻辑思维游戏源码-工厂逃生.zip

    scratch少儿编程逻辑思维游戏源码-工厂逃生.zip

    房地产 -辉盛阁项目介绍.pptx

    房地产 -辉盛阁项目介绍.pptx

    少儿编程scratch项目源代码文件案例素材-新拉力赛.zip

    少儿编程scratch项目源代码文件案例素材-新拉力赛.zip

    scratch少儿编程逻辑思维游戏源码-混乱弹球.zip

    scratch少儿编程逻辑思维游戏源码-混乱弹球.zip

    scratch少儿编程逻辑思维游戏源码-过马路.zip

    scratch少儿编程逻辑思维游戏源码-过马路.zip

    少儿编程scratch项目源代码文件案例素材-侠盗地牢冒险.zip

    少儿编程scratch项目源代码文件案例素材-侠盗地牢冒险.zip

    少儿编程scratch项目源代码文件案例素材-我的领土.zip

    少儿编程scratch项目源代码文件案例素材-我的领土.zip

    scratch少儿编程逻辑思维游戏源码-机器人闯关.zip

    scratch少儿编程逻辑思维游戏源码-机器人闯关.zip

    少儿编程scratch项目源代码文件案例素材-天空中的英雄.zip

    少儿编程scratch项目源代码文件案例素材-天空中的英雄.zip

    少儿编程scratch项目源代码文件案例素材-突击尖峰.zip

    少儿编程scratch项目源代码文件案例素材-突击尖峰.zip

    基于微信小程序的基于微信小程序的在线青旅预订平台(后端)

    “即刻青旅”前景广阔,随着青年旅舍行业快速发展,2030年市场规模预计达650亿。创作旨在为年轻旅行者打造专属平台,填补国内专门青旅预定空白。融合微信小程序、Spring Boot等技术,实现青旅查询预定、订单管理、活动职位查看及社区分享等功能。 后端框架: 基于Java的SpringBoot快速开发框架 借助Mybatis-plus构建ORM模型进行数据库操作 第三方API:高德地图、腾讯地图

    少儿编程scratch项目源代码文件案例素材-像素猫3.zip

    少儿编程scratch项目源代码文件案例素材-像素猫3.zip

    10bit 50MHz SAR ADC设计与Cadence仿真:基于SMIC 40nm工艺库的新手指南

    内容概要:本文是一份详细的10bit 50MHz SAR ADC学习指南,旨在帮助新手掌握从基础理论到实际电路设计的全过程。文中详细介绍了Cadence仿真工具的应用以及SMIC 40nm工艺库的具体使用方法。重点讲解了栅压自举开关、CDAC(电荷再分配模数转换器)、比较器和SAR逻辑等核心模块的设计原理和技术要点。此外,还提供了测试电路的构建方法及其性能评估手段,如INL/DNL曲线绘制。最后提到了更高性能TI ADC的扩展接口,为后续深入研究打下基础。 适合人群:对模拟集成电路设计感兴趣的电子工程专业学生或刚入行的研发人员。 使用场景及目标:适用于希望深入了解SAR ADC架构、提高自身硬件设计能力的学习者;目标是在实践中掌握关键技术和优化技巧,能够独立完成类似项目的开发。 其他说明:文章不仅提供理论知识,还包括大量实用的操作提示和常见错误避免建议,有助于读者快速上手并减少试错成本。

    scratch少儿编程逻辑思维游戏源码-防空火力 3D.zip

    scratch少儿编程逻辑思维游戏源码-防空火力 3D.zip

    智慧消防安全感知平台(IOT云消防)PPT(21页).pptx

    智慧消防安全与应急管理是现代城市安全管理的重要组成部分,随着城市化进程的加速,传统消防安全管理面临着诸多挑战,如消防安全责任制度落实不到位、消防设施日常管理不足、消防警力不足等。这些问题不仅制约了消防安全管理水平的提升,也给城市的安全运行带来了潜在风险。然而,物联网和智慧城市技术的快速发展为解决这些问题提供了新的思路和方法。智慧消防作为物联网和智慧城市技术结合的创新产物,正在成为社会消防安全管理的新趋势。 智慧消防的核心在于通过技术创新实现消防安全管理的智能化和自动化。其主要应用包括物联网消防安全监管平台、城市消防远程监控系统、智慧消防平台等,这些系统利用先进的技术手段,如GPS、GSM、GIS等,实现了对消防设施的实时监控、智能巡检和精准定位。例如,单兵定位方案通过信标点定位和微惯导加蓝牙辅助定位技术,能够精确掌握消防人员的位置信息,从而提高救援效率和安全性。智慧消防不仅提升了消防设施的管理质量,还优化了社会消防安全管理资源的配置,降低了管理成本。此外,智慧消防的应用还弥补了传统消防安全管理中数据处理方式落后、值班制度执行不彻底等问题,赋予了建筑消防设施智能化、自动化的能力。 尽管智慧消防技术在社会消防安全管理工作中的应用已经展现出巨大的潜力和优势,但目前仍处于实践探索阶段。相关职能部门和研究企业需要加大研究开发力度,进一步完善系统的功能与实效性。智慧消防的发展既面临风险,也充满机遇。当前,社会消防安全管理工作中仍存在制度执行不彻底、消防设施日常维护不到位等问题,而智慧消防理念与技术的应用可以有效弥补这些弊端,提高消防安全管理的自动化与智能化水平。随着智慧城市理念的不断发展和实践,智慧消防将成为推动社会消防安全管理工作与城市化进程同步发展的关键力量。

    scratch少儿编程逻辑思维游戏源码-节奏空间.zip

    scratch少儿编程逻辑思维游戏源码-节奏空间.zip

Global site tag (gtag.js) - Google Analytics