您的位置:首页 > 编程语言 > C语言/C++

有关于提高C/C++运行效率以及避免出现Bug的几种常见的实用方法

2015-11-30 21:28 441 查看
摘要: 这是在工作和学习中总结的有关于提高C/C++运行效率以及避免出现Bug的几种常见的实用方法,当然还有许多更有效的方式有待进一步的探索。

提高C/C++效率


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

切记extern char *hello;与entern char hello[ ]是两个概念,不要以为数组名是指针就可以乱用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息