关于 while(1)和for(;;)效率问题的一点想法
来源:互联网 发布:oceanbase数据库php 编辑:程序博客网 时间:2024/05/30 23:06
这几天看到好友的文章关于while(1)和for(;;)效率的讨论,手痒说了两句。回头一寻思,自己也只是推断。没有做任何实验,我们就看看这两种写法到底有什么区别:
实验环境:IAR EWARM 5.2
我就随便在一个嵌入式项目上做文章了,首先工程C语言编译优化选择了None, 输出选择带汇编输出,输出的汇编文件和C语言对应上。
我在main函数里先用for(;;)写了个死循环,我们看看编译结果:
注意main.c生成了一个对应的main.s
可以看到,是用一条跳转指令直接替代的for (;;)。
再更改一下代码:
编译一下看结果:
while(1)的循环也是一句跳转指令所替代。
IAR EWARM 5.2下,可见 for(;;)和while(1)在未开优化代码级别下,完全一样。无任何区别。
我们再来看看 linux 下的arm-rtems4.9-gcc的结果:
我写了一个很简单的代码:
先看看 while (1)的编译结果:
使用图形中的命令依次键入:
可以看到,while(1)循环已经变成了一个b .L7,并没有对1做判断。也是1条指令就搞定了。
我们再来看看for(;;)
键入以下命令:
查看结果如下:
两个结果是一样的。同样,gcc我也没有打开优化,如果需要看优化编译汇编结果的朋友们,可以使用gcc -O2 -S test.c,也可以使用 gcc -Os -S test.c,-Os在嵌入式里用得多一些。没有优化的代码都是一样的,更不要说优化过的代码。
其实这是个挺蛋疼的话题,C/C++本来就书写灵活,编译器的优化是千差万别,各有特点。这让我想起了,谭浩强老师写的《C语言程序设计》,我从一开始就不认为谭老师这本书怎么样,但我也写不出更好的书来。可以肯定的是,对于书中 ++i, i++,以及执行结果和编译器高度相关的写法大量出现。害人啊。换一个编译器执行结果就不一样。实在是误人子弟。但这也是个不争的事实,那就是,规范写法,可以避免在多个编译器中移植带来的风险。
对于友人博客中所说,for(;;)和while(1)效率孰高孰低的讨论,我个人觉得:
1.本身这两种写法无任何区别,和编译器高度相关,这个是我们有能力则关心,没能力关心也不需要太关心的事;
2.嵌入式代码对C/C++写法要求很高,建议有基础的朋友们阅读阅读MISRA-C2004, 2008 和一些C++的国际级标准规范;
3.把主要的精力多放在代码的规范上,而不是代码的效率上。毕竟,单片机也使足够的快了,绝大部分情况下成立;如果你是做代码优化或者做算法的朋友们,建议多读读《计算机程序设计的艺术》一书,再掌握好一门汇编语言。将会有极大的用处。
- 关于 while(1)和for(;;)效率问题的一点想法
- 关于 while(1)和for(;;)效率问题的一点想法
- 关于 while(1)和for(;;)效率问题的一点想法
- for(;;)和while(1)的效率问题
- 关于for while的效率问题
- while和for的效率问题
- C和PHP中while和for效率的一点研究
- for(;;)与while(1)的效率分析
- 关于效率问题的一点心得
- 关于Python2的一点想法以及遇到的问题
- 关于.net的一点想法
- 关于黄家驹的一点想法
- 关于UML的一点想法
- 关于Wiki 的一点想法
- 关于 EPO 的一点想法
- 关于屏蔽的一点想法
- 关于J2SE的一点想法
- 关于离开的一点想法
- 字符串处理
- 【Visual C++】游戏开发笔记二十九 一步一步教你用优雅的Direct3D11代码画一个三角形
- 介绍几个图论和复杂网络的程序库 —— BGL,QuickGraph,igraph和NetworkX
- poj 2226 Muddy Fields 二分匹配匈牙利
- WCF足迹8:事务
- 关于 while(1)和for(;;)效率问题的一点想法
- 阿里巴巴集团去IOE运动的思考与总结
- python re模块
- 女性收入最高的20个工作一览
- 秋天
- .net WinForm用户控件开发--(2)带按钮DataGridView
- 微笑
- HTML方面优化 (4)
- 笑的力量