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

关于 while(1)和for(;;)效率问题的一点想法的更多相关文章

  1. ArcGIS地图文档MXD效率慢的一点建议(二)

    经常有用户询问,我的MXD图层比较多,而且配置好了相关的符号,但是我的服务器更换了一下,而且两个服务器的要素类名称都是一样的,我想配置一下新的数据源,而且我的这个MXD已经连接不到原来的数据源了,打开 ...

  2. 关于提高python程序执行效率的思路和想法

    相比编译型语言(C系列)python胜在简介的语法和优雅的动态编程体验,但是在执行效率上,python有解释性语言先天的劣势——执行效率较低,为了让编写出的程序获得更快的执行效率,开启此文章. pyt ...

  3. ASP.NET中数据邦定效率问题的一点看法 - 转载(自由的天空)

    在 做Asp.NET开发的时候经常用到DataList.Repeater等,用这些控件的时候经常用到数据邦定,很多程序员都是按照MS提供的方 法<%#DataBinder.Eval(Contai ...

  4. if else和switch case那个效率更高一点

    switch...case写法: switch (表达式){ case 值1 : 语句1 break; case 值2 : 语句2 break; ... default : 语句n break; } ...

  5. 【uva 1612】Guess(算法效率,2种想法)

    题意:已知 N 位选手的3题的预期得分,得分要不全拿,要不为0.且知道最后的实际名次,而且得分相同的选手,ID小的排在前面.问这样的名次可能吗.若可能,输出最后一名的最高可能得分.(N≤16384) ...

  6. atitit.提升开发效率---mda 软件开发方式的革命

    atitit.提升开发效率---mda 软件开发方式的革命 1. 软件开发方式的革命开发工具的抽象层次将再次提升 1 2. 应用框架和其实现相分离 2 3. 目前的问题模型和代码不同步 2 4. MD ...

  7. Linux探秘之I/O效率

    一.文章来由 最近看了<UNIX环境高级编程>,对以前比较模糊的一些知识结构又做了进一步的加强,特别是前两章讲到不带缓冲的文件I/O和带缓冲的标准I/O,对read.write.fread ...

  8. c# 序列化效率比拼

    前言:作为开发人员,对象的序列化经常用到,特别是在现在前后端分离 采用json 交互 ,就将原来用过的几种方式总结了下,也算是做一个记录,顺便做了下性能测试. 1:内置 JavaScriptSeria ...

  9. atitit.提高开发效率---mda 革命性的软件开发方法

    atitit.提高开发效率---mda 革命性的软件开发方法 1. 软件开发方式的革命开发工具的抽象层次将再次提升 1 2. 应用框架和事实上现相分离 2 3. 眼下的问题模型和代码不同步 2 4.  ...

随机推荐

  1. 怎么上传自己的代码/项目到自己的github仓库上

    创建新的git仓库   设置新仓库   创建完成后   复制git地址   现在已经有window git客户端了(地址:https://desktop.github.com/),但还是建议用git命 ...

  2. Android图片加载框架最全解析(五),Glide强大的图片变换功能

    大家好,又到了学习Glide的时间了.前段时间由于项目开发紧张,再加上后来又生病了,所以停更了一个月,不过现在终于又可以恢复正常更新了.今天是这个系列的第五篇文章,在前面四篇文章的当中,我们已经学习了 ...

  3. [Android] Anreoid repo 切换分支

    reference : http://blog.csdn.net/lihui130135/article/details/40858885 如果已经有android仓库但是还不是最新的,想切换到And ...

  4. 如何解决Maven速度慢

    注:oschina已失效 Maven 远程仓库 <mirror> <id>ui</id> <mirrorOf>central</mirrorOf& ...

  5. mac下使用brew安装java等应用

    可以使用brew安装很多应用,比如java,idea,iterms,sublime brew tap caskroom/versions 将会安装新的brew仓库源brew cask install ...

  6. @Java VisualVM分析堆转储文件

    测试程序 public class HeapOOM { private static int i = 0; static class OOMObject { } public static void ...

  7. iOS开发-UIApplication和App启动状态

    UIApplication简单从字面上了解就是应用程序,开发的时候有的时候会根据需要调用其中的方法,看起来不起眼,实际在iOS开发UIApplication提供了iOS程序运行期间的控制和协作工作.每 ...

  8. NYOJ-267 郁闷的C小加(二)

    郁闷的C小加(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 聪明的你帮助C小加解决了中缀表达式到后缀表达式的转换(详情请参考“郁闷的C小加(一)”),C小加很 ...

  9. 数据库操作语句类型(DQL、DML、DDL、DCL)简介

    SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML,数据定义语言DDL,数据控制语言DCL. 1. 数据查询语言DQL数据查询语言DQL基本结构是由SELECT子句,FROM子句,WHER ...

  10. Spark+Kafka的Direct方式将偏移量发送到Zookeeper实现(转)

    原文链接:Spark+Kafka的Direct方式将偏移量发送到Zookeeper实现 Apache Spark 1.3.0引入了Direct API,利用Kafka的低层次API从Kafka集群中读 ...