《【智能车新手入门】-如何提高c代码效率》由会员分享,可在线阅读,更多相关《【智能车新手入门】-如何提高c代码效率(6页珍藏版)》请在金锄头文库上搜索。
1、岱默科技 http:/ 岱默科技 用心服务 2014/9/22 岱默科技岱默科技 | DEMOK 岱默科技DEMOK 智能车新手入门智能车新手入门 如何如何提高提高 C 代码代码效率效率 岱默科技 http:/ 岱默科技 用心服务 针对刚接触编程的新手常常容易忽视的一些细节而又关键的问题,想要让你的智能车控制代码更规范、更高效、更节省时间,岱默给出如下建议: 1、使用尽量小的数据类型能够使用字符型(char)定义的变量,就不要使用整型 (int)变量来定义;能够使用整型变量定义的变量就不要用长整型(longint),这 样做能有效节省数据空间, 在定义变量后不要超过变量的作用范围, 如果超过变
2、 量的范围赋值,C编译器并不报错,但程序运行结果却错了,而且这样的错误很 难发现。 2、在设计较复杂算法(比如图像处理算法)时,能不使用浮点型(float)变量就 不要使用浮点型变量,尽量转换为整形变量,运算速度可以提高甚至几十倍。在 控制周期为毫秒级的智能车中运算时间尤为重要。 3、 用移位实现乘除法运算 a=a*4;b=b/4;可以改为: a=a2;常如果需要 乘以或除以2n, 都可以用移位的方法代替。 用移位的方法得到代码比调用乘除法 子程序生成的代码效率高。实际上,只要是乘以或除以一个整数,均可以用移位 的方法得到结果,如:a=a*9可以改为:a=(a0;i-) ; 两个函数的延时效果
3、相似, 但几乎所有的 C编译对后一种函数生成的代码均比前 一种代码少13个字节, 因为几乎所有的 MCU均有为0转移的指令, 采用后一种方 式能够生成这类指令。在使用while循环时也一样,使用自减指令控制循环会比 使用自加指令控制循环生成的代码更少 13个字母。 但是在循环中有通过循环变 量“i”读写数组的指令时,使用预减循环有可能使数组超界,要引起注意。 (4)、while循环和dowhile循环 用while循环时有以下两种循环形式: unsigned int i; i=0; while (i0); 在这两种循环中,使用 dowhile循环编译后生成的代码的长度短于 while循 环。
4、(5)选择好的无限循环 在编程中,我们常常需要用到无限循环,常用的两种方法是 while (1) 和 for (;)。 这两种方法效果完全一样,但那一种更好呢?然我们看看它们编译后的代码: 编译前: while (1); 编译后: mov eax,1 test eax,eax je foo+23h jmp foo+18h 编译前: for (;); 编译后: 岱默科技 http:/ 岱默科技 用心服务 jmp foo+23h 显然,for (;)指令少,不占用寄存器,而且没有判断、跳转,比 while (1) 好。 7、 把本地函数声明为静态的(static)如果一个函数只在实现它的文件中被使
5、用, 把它声明为静态的(static)以强制使用内部连接。否则, 默认的情况下会把函数 定义为外部连接。这样可能会影响某些编译器的优化比如,自动内联。 8、 使用嵌套的 if结构在if结构中如果要判断的并列条件较多, 最好将它们拆分 成多个 if结构,然后嵌套在一起,这样可以避免无谓的判断。 9、Switch语句中根据发生频率来进行 case排序Switch 可能转化成多种不同算 法的代码。其中最常见的是跳转表和比较链/树。当switch用比较链的方式转化 时,编译器会产生 if-else-if的嵌套代码,并按照顺序进行比较,匹配时就跳 转到满足条件的语句执行。所以可以对 case的值依照发生
6、的可能性进行排序, 把最有可能的放在第一位,这样可以提高性能。此外,在case中推荐使用小的连 续的整数,因为在这种情况下,所有的编译器都可以把 switch 转化成跳转表。 不好的代码: int days_in_month, short_months, normal_months, long_months; switch (days_in_month) case 28: case 29: short_months +; break; case 30: normal_months +; break; case 31: long_months +; break; default: cout “m
7、onth has fewer than 28 or more than 31 days“ endl; break; 推荐的代码: int days_in_month, short_months, normal_months, long_months; switch (days_in_month) case 31: long_months +; break; 岱默科技 http:/ 岱默科技 用心服务 case 30: normal_months +; break; case 28: case 29: short_months +; break; default: cout “month has fewer than 28 or more than 31 days“ endl; break; 当然,以上只是岱默总结出来的针对新手的一些最常见但是很有效的优化方 案,肯定还有其他好的方法是岱默所遗漏的,想要在程序猿的路上越走越远,一 定还有更多更多的知识等待着大家去发掘,岱默与你共同进步! 联系我们 淘宝店铺 : http:/ 技术交流 QQ 群 : 108190422 摄像头群 132879827 光电群 118404899 电磁群 技术交流邮箱 : 技术论坛 : http:/ 官方网站 : /-END-/