这几天看到好友的文章关于while(1)和for(;;)效率的讨论,手痒说了两句。回头一寻思,自己也仅仅是判断。没有做不论什么实验,我们就看看这两种写法究竟有什么差别:

实验环境:IAR EWARM 5.2

我就随便在一个嵌入式项目上做文章了,首先projectC语言编译优化选择了None, 输出选择带汇编输出,输出的汇编文件和C语言相应上。

我在main函数里先用for(;;)写了个死循环,我们看看编译结果:

注意main.c生成了一个相应的main.s

能够看到,是用一条跳转指令直接替代的for (;;)。

再更改一下代码:

编译一下看结果:

while(1)的循环也是一句跳转指令所替代。

IAR EWARM 5.2下,可见 for(;;)和while(1)在未开优化代码级别下,全然一样。无不论什么差别。

我们再来看看 linux 下的arm-rtems4.9-gcc的结果:

我写了一个非常easy的代码:

先看看 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.把基本的精力多放在代码的规范上,而不是代码的效率上。毕竟,单片机也使足够的快了,绝大部分情况下成立;假设你是做代码优化或者做算法的朋友们,建议多读读《计算机程序设计的艺术》一书,再掌握好一门汇编语言。将会有极大的用处。

最新文章

  1. indexOf 用法
  2. CodeSimth - .Net Framework Data Provider 可能没有安装
  3. outlook新邮件到达提醒设置以及outlook最小化到托盘设置
  4. Python的设计模式学习
  5. ubuntu wubi安装注意事项
  6. Initialising Memories
  7. 判断UA这种事不能说的太明。
  8. Redis的发布订阅及.NET客户端实现
  9. 12、SEO工程师指南 - 软件项目角色指南系列文章
  10. 两种简单的方法Docker构建LANMP
  11. HBase 协处理器实现二级索引
  12. Vue使用枚举类型实现HTML下拉框
  13. linux命令logger使用
  14. 转载 [c#] 虚函数(Virtual),抽象函数(abstract)和接口的区别
  15. Qt小项目之串口助手控制LED
  16. 【Hadoop学习之六】MapReduce原理
  17. RNN实例
  18. lesson4-图像分类-小象cv
  19. my big day is coming!
  20. “吃神么,买神么”的第一个Sprint计划(第三天)

热门文章

  1. [实时更新]jquery全部版本号下载
  2. Gunicorn+Flask中重复启动后台线程问题
  3. Java读取properties配置文件经常用法
  4. ActiveMQ使用示例之Queue
  5. [15] 星星(Star)图形的生成算法
  6. 血淋淋的事实告诉你:你为什么不应该在JS文件中保存敏感信息
  7. Terrain tessellation &&Threaded Rendering Vk
  8. 深入理解模型,视图和控制器(C#)
  9. C# 特性(Attribute)(二)
  10. mac利用Synergy操作多台电脑