嵌入式技术
其它的用法都属于不良风格,例如:
不可模仿布尔变量的风格而写成:
3、浮点变量与零值的比较 不可将浮点变量用“ ==” 或“ !=” 与任何数字比较 。千万要留意, 无论是 float还是 double类型的变量, 都有精度限制。 所以一定要避免将浮点变量用“ ==” 或“ !=” 与数字比较,应该设法转化成“ >=” 或“ <=” 形式。假设浮点变量的名字为 x,应当 将:
转化为:
其中 EPSINON是允许的误差(即精度) 。
不要写成:
或者:
记住,整形in的运算速度高浮点型float,并且可以被处理器直接完成运算,而不需要借助于FPU(浮点运算单元)或者浮点型运算库。 尽管这不保证编译器一定会使用到寄存器存储变量,也不能保证处理器处理能更高效处理unsigned整型,但这对于所有的编译器是通用的。 例如在一个计算包中,如果需要结果精确到小数点后两位,我们可以将其乘以100,然后尽可能晚的把它转换为浮点型数字。
对于ARM处理器,这个版本需要20+4.3N次循环。这是一个消耗很大的操作,应该尽可能的避免执行。 有时,可以通过乘法表达式来替代除法。例如,假如我们知道b是正数并且b*c是个整数,那么(a/b)>c可以改写为a>(c*b)。 如果确定操作数是无符号unsigned的,使用无符号unsigned除法更好一些,因为它比有符号signed除法效率高。
优先使用if语句,而不是取余数运算符,因为if语句的执行速度更快。这里注意新版本函数只有在我们知道输入的count结余0至59时在能正确的工作。
或者这样做:
一种更简洁、更快的方法是使用数组下标获取字符数组的值。如下:
5、使用别名 考虑如下的例子:
尽管*data的值可能从未被改变,但编译器并不知道anyfunc函数不会修改它,所以程序必须在每次使用它的时候从内存中读取它。如果我们知道变量的值不会被改变,那么就应该使用如下的编码:
这为编译器优化代码提供了条件。
尽管结果均相同,但是第一个程序片段运行速度高于后两者。


i从0循环到9。如果我们不介意循环计数的顺序,我们可以这样写:
这样快的原因是因为它能更快的处理i的值–测试条件是:i是非零的吗?如果这样,递减i的值。对于上面的代码,处理器需要计算“计算i减去10,其值非负吗? 如果非负,i递增并继续”。简单的循环却有很大的不同。这样,i从9递减到0,这样的循环执行速度更快。 这里的语法有点奇怪,但确实合法的。循环中的第三条语句是可选的(无限循环可以写为for(;;))。如下代码拥有同样的效果:
或者更进一步的:
这里我们需要记住的是循环必须终止于0(因此,如果在50到80之间循环,这不会起作用),并且循环计数器是递减的。使用递增循环计数器的代码不享有这种优化。
这个示例告诉编译器函数不会改变外部参数的值(使用const修饰),并且不用在每次访问时都进行读取。 同时,确保编译器限制任何对只读结构的修改操作从而给予结构数据额外的保护。
使用switch可能更快:
在if()语句中,如果最后一条语句命中,之前的条件都需要被测试执行一次。switch允许我们不做额外的测试。如果必须使用if…else…语句,将最可能执行的放在最前面。
编辑:黄飞
全部0条评论
快来发表一下你的评论吧 !