C语言常规优化策略--赋值语句优化

C语言常规优化策略


从理论上讲,程序的优化一般分为局部优化、循环优化和全局优化三个层次。所谓局部优化,重点在于删除程序中的无用赋值,利用语言的特性对基本赋值语句优化,局部优化一般不宜过多采用,但如果程序中总是有一些无效赋值或没有引用的变量,这可能给别人造成幼稚的印象;循环优化和全局优化往往能大幅提升程序效率,因此有关的技术对于高质量的程序设计是至关重要的。
本文讨论C语言程序常规优化策略,其重点在于局部优化和循环优化,包括赋值语句优化、条件语句优化、各类循环优化策略、参数传递、全局变量及宏的使用等内容,其中避免乘、除运算及浮点运算的方法是非常巧妙的。这些方法均为程序员广泛熟知并采用,这里,仅仅将它们收集在一起以备大家参考。
当然,各种优化策略的使用应具备时机,并遵循程序开发的基本准则。例如,对于循环优化,很多成熟的编译器均有十分全面的处理,非特别影响效率的代码段,一般不必考虑,而全局变量的采用往往会带来很多不良的副作用,一般也不宜采用。

1、赋值语句优化

1.1 避免无用赋值


在代码中,若一个变量经赋值后在后面语句的执行过程中不再引用,则这一赋值语句就称为无用赋值。且看下面杜撰的代码段
int DoSmth(int x)
{
 int y, z;

 if (x>=0)
  x=x;
 else
  x=-x;
 y=3;
 z=f(x);
 return z;
}
其中y=3为无用赋值语句,可以删除,而x=x语句是为了填补条件语句中条件成功分支的空缺,同样是无用的赋值。在这种情况下,可以直接删除该语句,只保留一个分号作为空语句标识,如果为醒目起见,则可用null来代替。下面给出修改后的代码段
int DoSmth(int x)
{
 int z;

 if (x>=0)
  null;
 else
  x=-x;
 z=f(x);
 return z;
}
当然程序可以采用更佳的结构以驱除null语句:
int DoSmth(int x)
{
 if (x<0)
  x=-x;
 return f(x);
}
但有时代码中为了保持逻辑上的完整性,或者出于理解代码的原因,有时会出现空语句,建议采用null的写法以警醒自己或其它人。
在C程序中,无效的变量声明应当从程序中删除,当出现无效的变量声明时,编译器一般会用“没有引用的变量”来警告你。
~~~~~~~~~~~~~~

1.2 合并已知量


我们要计算两点之间的距离,相应的点结构及代码的如下:
typedef struct tagPoint
{
 double x,y;
} Point;

double Dist(Point P1, Point P2)
{
 return sqrt((P1.x-P2.x)* (P1.x-P2.x)+(P1.y-P2.y) (P1.y-P2.y));
}
代码中, P1.x-P2.x,P1.y-P2.y均计算两次,如果我们将一次计算的结果保留下来,就可以减少相应的操作次数
double Dist(Point P1, Point P2)
{
 double xDelta= P1.x-P2.x;
 double yDelta= P1.y-P2.y;
 return sqrt(xDelta*xDelta+yDelta*yDelta);
}
程序设计中还存在一种现象,为了方便,我们通常定义一系列常量,在代码中会反复引用这些常量,例如下面的代码中定义了一个圆周率常量,并在圆周长的计算中出现对它的引用
#define PI 3

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值