c代码优化方案

对于代码的运行速度有严格要求的场合,优化就成了一项很有意义的工作。如下是一些关于c代码优化的学习笔记。

1.数组和指针

数组和指针有着非常密切的关系。相比较来说,数组比较直观,更通俗易懂。但指针更加灵活简洁,在要求执行速度高的场合显得尤为重要。在很多情况下,我们可以用指针运算来代替数组的索引。例如:`

数组索引:
int Arr[6]={0,1,2,3,4,5},i,temp;
for(i=0;i<6;)
{
  temp = Arr[i++];
}

指针索引:
int Arr[6]={0,1,2,3,4,5};
int *p = Arr;
for(;*p!=0;)
{
  p++;
}

这样替换的好处就是,在P得到Arr的地址后,循环中只需要对P中的地址自加便可以得到下一个地址存放的值,而不需要像数组索引那样每次都进行数组下标的复杂运算。

2.数据类型的使用

在编写代码的时候,定义变量应尽量使用小的数据类型,例如数据范围在0-255时尽量使用char,而不要使用int,long等类型,这样可以节省内存空间。特别是尽量少使用浮点类型,因为这会使代码的执行速度降低很多。

3.运算优化

在运算中,要尽量避免整数除法,因为除法是最慢的一种运算。

(1).求余

当除数为2的n次方时,可以用位操作的方法来代替。

例如:
a %= 2^n;
可以改为:
a &= 2^n-1;

(2).乘法

当使用数学函数求平方和立方时,直接使用运算符求解。

a = pow(a,2.0)  改为 a = a*a;
或者:
a = pow(a,3.0)  改为 a = a*a*a;

(3).移位实现乘除法运算

当乘数是(2^n+x)时

a *=2^n+x); 可以改为:a = (a<<n)+a*x;

当乘数是2^n时

a *=2^n); 可以改为:a = (a<<n);

当除数是2^n时

a /=2^n); 可以改为:a = (a>>n);

注:
1.只有整型数据类型才可以进行移位操作,不支持对浮点和布尔数据类型操作。
2.对于无符号整型数据类型,直接进行移位操作
3.对于有符号整型数据类型,需注意:
(1). 对负数进行左移:符号位始终为1,其他位左移。
(2).对正数进行左移:所有位左移,即 <<,可能会变成负数。
(3).对正数进行右移:所有位右移,即 >>

4.使用复合赋值表达式

例如(a+=1;a-=1;a*=2;…)等,可以生成高质量,高效率的代码。

5.定义的变量排序先后问题

在定义变量的时候,应该将长的变量放在短的变量面前,因为编译器在分配给变量空间时,分配顺序是和它们在源代码中声明的顺序是一样的,所以只要第一个变量对齐了,之后的变量也会连续的存放,避免了内存浪费的情况。

6.结构体变量定义的排序

原理同第五点,也是将长变量放在短变量的前面,使得字节对齐,节省内存空间。同时把结构体填充为最长类型长度的整数倍。

7.延时函数优化

通常情况下,软件延时函数均是采用自加的形式,对其优化,应将其改为自减的形式。

 unsigned char i;
自加:
void delay()
{
 for(i=0;i<100;i++);
}
自减:
void delay()
{
 for(i=100;i>0;i--);
}

原因:几乎所有的c编译器对自减延时函数生成的代码比自加延时函数生成的代码少1~3个字节,所有MCU都有判0转移的指令,使用自减延时能够生成这类指令。

说明:本篇优化学习笔记由个人学习整理而来,资料来源于网上,在此对提供资料的作者表示感谢!同时笔记内容多为自己理解记录,如有错误,欢迎各位读者指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值