博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
有关于提高C/C++运行效率以及避免出现Bug的几种常见的实用方法
阅读量:5784 次
发布时间:2019-06-18

本文共 1969 字,大约阅读时间需要 6 分钟。

hot3.png

提高C/C++效率

  1. 若可以替代的话,尽可能使用前缀操作符代替后缀操作符,如利用++i来代替i++,因为后缀操作符会产生一个临时变量,并且涉及到复杂的拷贝复制等。

  2. 对于乘法操作尽可能的利用位运算,如b= a * 16可以改写为b = a << 4,因为位操作的效率要比乘法以及除法的效率高。

  3. 一个很好的交换两个数的方法:a = a^b; b = a^b; a = a^b;既可以将变量a与变量b进行交换,即消除了交换变量值时所用的临时变量,同时提高了效率。

  4. for循环中for(int i = 0; i != 100; ++i) 尽可能的使用 != 号而不是 < 号,除非必须使用 < 才不用 !=

  5. C++中变量初始化的时候尽量使用int i(0);而不是int i = 0;的方式来给变量初始化。

  6. 使用memset()memcpy()memcmp()来代替strcpy()strcmp()等函数。

  7. 使用snprintf()来代替sprintf()函数,永远也不要用sprintf()函数。

  8. 使用fgets()函数来代替gets()函数,放置输入的字符串太长而引起内存泄露。

  9. 所有定义的*.h的头文件都必要加上#ifndef  #define …. #endif这样的结构,从而避免头文件被重复引用,而造成程序出错。

  10. 定义结构体时,通常在前面加上typedef形成typedef struct{ } std;这样的结构。这样给结构体起个别名,使结构体更加清晰。

  11. 所有的常数都应该用宏定义,如 #define OK 1 这样的方式,而不是直接使用1,从而防止“魔数”的发生,而switch…case语句则采用enum{ }; 来避免“魔数”。

  12. 合理的使用register以及 inline函数对程序进行优化,对于不发生变化的常量一定要加const关键字,从而避免常量被修改。

  13. 对于那些只需要做一次计算的操作,要提到循环的外面进行操作,从而避免每次循环都进行一次不必要的计算。如for(int i = 0; i != strlen(a); ++i);中的strlen(a)要提到for循环的外面。即int Len = strlen(a); for(int i = 0; i != Len; ++i);这样stelen(a)仅运行了一次。

  14. 对于变量定义的位置问题,尽量要做到“直到非定义不可的时候才定义”这样可以有效的减小该变量占用内存的时间,同时也可以避免定义的变量最后没有用到的现象。

  15. for循环嵌套循环等,要尽可能的将次数多的循环放置最内层,次数少的循环放在最外层,这样可以减少计算机进行“切换”,从而提高运行的效率。

  16. 对于条件判断如if…else语句以及switch…case语句等要将可能性大的操作放在前面,这样可以减小计算机对程序进行逐次判断的概率,可以及时的命中操作,从而可以提高效率。

  17. 对于矩阵相乘运算,尽可能的不要使用我们通常采用的方式,即 *列,而是采用依次相乘然后累加的策略,从而避免内存的未命中的情况。

  18. 在调用free()函数释放指针的时候要将指针变量指为空,即free(p); p = NULL;从而防止指针成为野指针。

  19. 对于sizeof()操作符,对操作变量并没有改变,即int i = 10sizeof(++i); 运行完毕后i的值仍然为10而不是11

  20. 对于&&以及||表达式来说,其满足最优原则,即如( f1() == f2() ) && ( f3() == f4() )若第一个表达式为假的话就不会运行第二个表达式,同理对于||操作符来说,若第一个表达式为真,则不会运行第二个表达式。

  21. 对于简单的if…else…操作,尽量使用三目运算符A>B?A:B来替换可以提高程序的运行效率。

  22. C++中使用运算符时尽量只用一种运算符,这样当进行运算符重载时,可以减少重载函数的数目,简化代码。

  23. Static关键字修饰局部变量的时候,表征此变量保持不变;在修饰全局变量的时候,表征此全局变量只能在本模块中反问,对其他模块是不可见的;当修饰一个函数时,也表征着此函数仅在当前模块中有效。

  24. Volatile关键字修饰变量表征着此变量将被存于内存中,每次程序访问时都将从新从内存中提取,而不会被优化。通常用于(1)硬件设备的某些寄存器(如:状态寄存器);(2)某些ISR会访问到的非自动变量(Non-automatic variables);(3)多线程应用中被几个任务共享的变量。

  25. 切记extern  char *hello;entern char hello[ ]是两个概念,不要以为数组名是指针就可以乱用。

转载于:https://my.oschina.net/u/1032782/blog/537026

你可能感兴趣的文章
数据解码互联网行业职位
查看>>
我所见的讲的最容易理解,逻辑最强的五层网络模型,来自大神阮一峰
查看>>
vue-cli项目打包需要修改的路径问题
查看>>
js实现复选框的操作-------Day41
查看>>
数据结构化与保存
查看>>
[SpringBoot] - 配置文件的多种形式及优先级
查看>>
chrome浏览器开发者工具之同步修改至本地
查看>>
debian7 + wheezy + chromium + flashplayer
查看>>
AOP
查看>>
进阶开发——文档,缓存,ip限速
查看>>
vue中子组件需调用父组件通过异步获取的数据
查看>>
uva 11468 - Substring(AC自己主动机+概率)
查看>>
Mysql 数据备份与恢复,用户创建,授权
查看>>
沉思录
查看>>
Angular.js中的$injector服务
查看>>
构建之法读书笔记01
查看>>
linux - lsof 命令最佳实践
查看>>
kafka性能测试
查看>>
现实世界的Windows Azure:h.e.t软件使用Windows Azure削减50%的成本
查看>>
深入.net框架
查看>>