论坛首页 编程语言技术论坛

编程谏言3

浏览 3194 次
锁定老帖子 主题:编程谏言3
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (9)
作者 正文
   发表时间:2009-08-05   最后修改:2009-08-05
C
  alan谏言3:Syntactic sugar causes cancer of the semicolon. 语法糖衣导致了代码的弊病。
   语法糖衣是由Peter J. Landin创造的一个术语,是指用在一门语言中,用该语言语法包装程序,使程序语句更适合于人类的思维方式。它使得程序员使用该语言起来更舒适。特别来说,对于某个语言中的某个控件是可以由语言的其它语法来替换,并且不对完成的功能有任何的影响。举个语法糖衣的例子:
   在C语言中,对数组的访问,我们可以同  array[i]这种下标的方式来访问,但是其实这是一个语法糖衣,可以通过 *(array + i)来访问。
   语法糖衣是对原有指令等的包装,但是是否因此就增加了代码出现问题的概率。还不得而知。
   发表时间:2009-12-07  
array[i] 和 *(array + i)

效率上*理论会快点,但是大多数场合,这两个差不多。
0 请登录后投票
   发表时间:2009-12-08  
jinleileiking 写道
array[i] 和 *(array + i)

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



现在的编译器 能自动优化这种代码了。 毕竟前者可读性更好些。
0 请登录后投票
   发表时间:2009-12-09  
jinleileiking 写道
array[i] 和 *(array + i)

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

记得是前者会快,因为前者大部分编译器会做优化,而后者的语法树比较复杂,很难优化。
0 请登录后投票
   发表时间:2009-12-29  
mikeandmore 写道
jinleileiking 写道
array[i] 和 *(array + i)

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

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

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

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

也许比较老的不会自动优化吧。。ls有什么经验?分享一下。
0 请登录后投票
   发表时间:2009-12-29   最后修改:2009-12-29
mikeandmore 写道
jinleileiking 写道
array[i] 和 *(array + i)

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

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

我很有兴趣知道前者究竟会优化成什么样以致于比后者快?
0 请登录后投票
   发表时间: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就都有了
0 请登录后投票
   发表时间:2009-12-30  
实现编译器的时候,arr[i]比*(arr + i)可以保持更多高级语义,因而可以更方便的支持指针别名分析,所以在现在的优化编译器里反而是前者更容易被优化。
GCC在-O0为*(arr + i)生成了独立的 取偏移量-取基地址-加-移动 的指令序列的罪魁祸首不知道是不是指令选取的步骤,因为这个序列形成的模式完全可以在指令选取时被合并为一条base + scale*offset的寻址模式的指令……求验证。

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

0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics