C语言高效编程的几招
C语言高效编程的几招
华中科技大学 丁学
编写高效简洁的C语言代码,是许多软件工程师追求的目标.本文就工作中的一些体会和经
验做相关的阐述,不对的地方请各位指教.
第1招:以空间换时间
计算机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程
序的效率问题,我们就有了解决问题的第1招--以空间换时间.
例如:字符串的赋值.
方法A,通常的办法:
#define LEN 32
char string1 [LEN];
memset (string1,0,LEN);
strcpy (string1,"This is an example!!"
方法B:
const char string2[LEN]="This is an example!"
char*cp;
cp=string2;
(使用的时候可以直接用指针来操作.)
从上面的例子可以看出,A和B的效率是不能比的.在同样的存储空间下,B直接使用指针就
可以操作了,而A需要调用两个字符函数才能完成.B的缺点在于灵活性没有A好.在需要频
繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字
符串,虽然占用了 大量的内存,但是获得了程序执行的高效率.
如果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数.
该招数的边招--使用宏函数而不是函数.举例如下:
方法C:
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
int BIT_MASK (int_bf)
{
return ((IU<<(bw##_bf))-1)<<(bs##_bf);
}
void SET_BITS(int_dst,int_bf,int_val)
{
_dst=((_dst) & ~ (BIT_MASK(_bf)))I\ (((_val)<<<(bs##_bf))&(BIT_MASK(_bf)))
}
SET_BITS(MCDR2,MCDR2_ADDRESS,RegisterNumber);
方法D:
#define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17
#define bmMCDR2_ADDRESS BIT_MASK (MCDR2_ADDRESS)
#define BIT_MASK(_bf)(((1U<<(bw##_bf))-1)<< (bs##_bf)
#define SET_BITS(_dst,_bf,_val)\ ((_dst)=((_dst)&~(BIT_MASK(_bf)))I (((_val)<<
(bs##_bf))&(BIT_MASK(_bf))))
SET_BITS(MCDR2,MCDR2_ADDRESS,RegisterNumber);
函数和宏函数的区别就在于,宏函数占用了大量的空间,而函数占用了时间.大家要知道
的是,函数调用是要使用系统的栈来保存数据的,如果编译器里有栈检查选项,一般在函
数的头会嵌入一些汇编语句对当前栈进行检查;同时,CPU也要在函数调用时保存和恢复当
前的现场,进行压栈和弹栈操作,所以,函数调用需要一些CPU时间.而宏函数不存在这个
问题.宏函数仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是
占用了空间,在频繁调用同一个宏函数的时候,该现象尤其突出.
D方法是我看到的最好的置位操作函数,是ARM公司源码的一部分,在短短的三行内实现了
很多功能,几乎涵盖了所有的位操作功能.C方法是其变体,其中滋味还需大家仔细体会.
第2招:数学方法解决问题
现在我们演绎高效C语言编写的第二招--采用数学方法来解决问题.
数学是计算机之母,没有数学的依据和基础,就没有计算机的发展,所以在编写程序的时
候,采用一些数学方法会对程序的执行效率有数量级的提高.
举例如下,求1~100的和.
方法E
int I,j;
for (I=1; I>3;
J=456-(456>>4<<4);
在字面上好象H比G麻烦了好多,但是,仔细查看产生的汇编代码就会明白,方法 G调用了
基本的取模函数和除法函数,既有函数调用,还有很多汇编代码和寄存器参与运算;而方
法H则仅仅是几句相关的汇编,代码更简洁,效率更高.当然,由于编译器的不同,可能效
率的差距不大,但是,以我目前遇到的MS C,ARM C来看,效率的差距还是不小.相关汇编
代码就不在这里列举了.
运用这招需要注意的是,因为CPU的不同而产生的问题.比如说,在PC上用这招编写的程
序,并在PC上调试通过,在移植到一个16位机平台上的时候,可能会产生代码隐患.所以
只有在一定技术进阶的基础下才可以使用这招.
第4招:汇编嵌入
高效C语言编程的必杀技,第四招--嵌入汇编.
"在熟悉汇编语言的人眼里,C语言编写的程序都是垃圾".这种说法虽然偏激了一些,但
是却有它的道理.汇编语言是效率最高的计算机语言,但是,不可能靠着它来写一个操作
系统吧 所以,为了获得程序的高效率,我们只好采用变通的方法--嵌入汇编,混合编
程.
举例如下,将数组一赋值给数组二,要求每一个字节都相符.char string1[1024],
string2[1024];
方法I
int I;
for (I=0; I<1024; I++)
*(string2+I)=*(string1+I)
方法J
#int I;
for(I=0; I<1024; I++)
*(string2+I)=*(string1+I);
#else
#ifdef_ARM_
_asm
{
MOV R0,string1
MOV R1,string2
MOV R2,#0
loop:
LDMIA R0!,[R3-R11]
STMIA R1!,[R3-R11]
ADD R2,R2,#8
CMP R2, #400
BNE loop
}
#endif
方法I是最常见的方法,使用了1024次循环;方法J则根据平台不同做了区分,在ARM平台
下,用嵌入汇编仅用128次循环就完成了同样的操作.这里有朋友会说,为什么不用标准的
内存拷贝函数呢 这是因为在源数据里可能含有数据为0的字节,这样的话,标准库函数会
提前结束而不会完成我们要求的操作.这个例程典型应用于LCD数据的拷贝过程.根据不同
的CPU,熟练使用相应的嵌入汇编,可以大大提高程序执行的效率.
虽然是必杀技,但是如果轻易使用会付出惨重的代价.这是因为,使用了嵌入汇编,便限
制了程序的可移植性,使程序在不同平台移植的过程中,卧虎藏龙,险象环生!同时该招
数也与现代软件工程的思想相违背,只有在迫不得已的情况下才可以采用.切记.
使用C语言进行高效率编程,我的体会仅此而已.在此已本文抛砖引玉,还请各位高手共同
切磋.希望各位能给出更好的方法,大家一起提高我们的编程技巧.
- spiflashc语言编程 > C语言高效编程的几招
-
C语言高效编程的几招
下载该文档 文档格式:DOC 更新时间:2007-11-01 下载次数:0 点击次数:3文档基本属性 文档语言: Simplified Chinese 文档格式: doc 文档作者: 微软用户 关键词: 主题: 备注: 点击这里显示更多文档属性 经理: 单位: 微软中国 分类: 创建时间: 上次保存者: 修订次数: 编辑时间: 文档创建者: 修订: 加密标识: 幻灯片: 段落数: 字节数: 备注: 演示格式: 上次保存时间:
- 下载地址 (推荐使用迅雷下载地址,速度快,支持断点续传)
- DOC格式下载
- 更多文档...
-
上一篇:C语言编程规范
下一篇:计算机编程及C语言
点击查看更多关于spiflashc语言编程的相关文档
- 您可能感兴趣的
- 编程语言 编程语言排行榜 basic语言编程软件 计算机编程语言 易语言编程系统 plc编程语言 易语言编程论坛 编程语言有哪些 易语言编程
- 大家在找
-
- · 中专学校女生的教育
- · 汽车抛光多少钱
- · 中国鞋业人才网
- · 日光灯价格
- · 国航空客321座位图
- · 直流逆变电焊机构造
- · 财务会计简历模板
- · 高职院校专业设置
- · 苏州叉车证年审
- · 台车式环件热处理炉
- · so2的红外吸收带峰
- · download是什么意思
- · 管理运筹学张文杰
- · 场效应管驱动电路图
- · 宁德李海波简历
- · 李连杰好莱坞电影
- · 二级VF全真上机50套题之第五十套
- · apologize谁唱的
- · photoshopcs3教程pdf
- · c1倒杆移库技巧
- · 汽车保险理赔专业
- · 高职化学科研题目
- · 对外经济贸易大学远程教育商业道德
- · 初中数学创新教学案例
- · 明基t131
- · 7k7k小游戏战争类战争
- · 接地变压器容量计算
- · led城市亮化
- · 大运安保先进事迹材料
- · 膨化食品机械设备网
- · 磨工实习报告
- · flash8游戏制作教程
- · 上海模具设计招聘
- · 毛石混凝土配合比
- · 计算机的工作原理教案
- · 2011高职高专补录时间
- · 中医内科学咳嗽视频
- · ic卡考勤系统
- · 奶牛养殖场名录
- · 9c4b4cafrala0
- 赞助商链接