浏览 3194 次
锁定老帖子 主题:编程谏言3
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (9)
|
|
---|---|
作者 | 正文 |
发表时间:2009-08-05
最后修改:2009-08-05
语法糖衣是由Peter J. Landin创造的一个术语,是指用在一门语言中,用该语言语法包装程序,使程序语句更适合于人类的思维方式。它使得程序员使用该语言起来更舒适。特别来说,对于某个语言中的某个控件是可以由语言的其它语法来替换,并且不对完成的功能有任何的影响。举个语法糖衣的例子: 在C语言中,对数组的访问,我们可以同 array[i]这种下标的方式来访问,但是其实这是一个语法糖衣,可以通过 *(array + i)来访问。 语法糖衣是对原有指令等的包装,但是是否因此就增加了代码出现问题的概率。还不得而知。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-12-07
array[i] 和 *(array + i)
效率上*理论会快点,但是大多数场合,这两个差不多。 |
|
返回顶楼 | |
发表时间:2009-12-08
jinleileiking 写道 array[i] 和 *(array + i)
效率上*理论会快点,但是大多数场合,这两个差不多。 现在的编译器 能自动优化这种代码了。 毕竟前者可读性更好些。 |
|
返回顶楼 | |
发表时间:2009-12-09
jinleileiking 写道 array[i] 和 *(array + i)
效率上*理论会快点,但是大多数场合,这两个差不多。 记得是前者会快,因为前者大部分编译器会做优化,而后者的语法树比较复杂,很难优化。 |
|
返回顶楼 | |
发表时间:2009-12-29
mikeandmore 写道 jinleileiking 写道 array[i] 和 *(array + i)
效率上*理论会快点,但是大多数场合,这两个差不多。 记得是前者会快,因为前者大部分编译器会做优化,而后者的语法树比较复杂,很难优化。 要看编译器,我见过的编译器: KEIL, IAR,都会自动优化。我在项目中做过实验,验证过。。。该死的性能。。。 也许比较老的不会自动优化吧。。ls有什么经验?分享一下。 |
|
返回顶楼 | |
发表时间:2009-12-29
最后修改:2009-12-29
mikeandmore 写道 jinleileiking 写道 array[i] 和 *(array + i)
效率上*理论会快点,但是大多数场合,这两个差不多。 记得是前者会快,因为前者大部分编译器会做优化,而后者的语法树比较复杂,很难优化。 我很有兴趣知道前者究竟会优化成什么样以致于比后者快? |
|
返回顶楼 | |
发表时间: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就都有了 |
|
返回顶楼 | |
发表时间:2009-12-30
实现编译器的时候,arr[i]比*(arr + i)可以保持更多高级语义,因而可以更方便的支持指针别名分析,所以在现在的优化编译器里反而是前者更容易被优化。
GCC在-O0为*(arr + i)生成了独立的 取偏移量-取基地址-加-移动 的指令序列的罪魁祸首不知道是不是指令选取的步骤,因为这个序列形成的模式完全可以在指令选取时被合并为一条base + scale*offset的寻址模式的指令……求验证。 当然我们完全可以把base + scale*offset的寻址都用下标方式写……也怪怪的。总之怎么用看起来自然就怎么用总没错的。 |
|
返回顶楼 | |