
常用软件类: |
|杀毒安全 | |联络聊天 | |网络软件 | |多媒体类 | |系统工具 | |图形图像 | |系统工具 | |应用软件 | |行业软件 |
开发设计类: |
|动画制作 | |图像处理 | |3D设计 | |操作系统 | |站长学院 | |网络相关 | |WEB设计 | |数据库类 | |程序开发 |
第1招:以空间换时间
例如:字符串的赋值。
方法A,通常的办法:
| #define LEN 32
char string1 [LEN]; memset (string1,0,LEN); strcpy (string1,“This is a example!!”); |
方法B:
| const char string2[LEN] =“This is a example!”;
char * cp; cp = string2 ; (使用的时候可以直接用指针来操作。) |
如果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数。
该招数的变招——使用宏函数而不是函数。举例如下:
方法C:
| #define bwMCDR2_ADDRESS 4
#define bsMCDR2_ADDRESS 17 int BIT_MASK(int __bf) { return ((1U << (bw ## __bf)) - 1) << (bs ## __bf); } void SET_BITS(int __dst, int __bf, int __val) { __dst = ((__dst) & ~(BIT_MASK(__bf))) | \(((__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))) | \ (((__val) << (bs ## __bf)) & (BIT_MASK(__bf)))) SET_BITS(MCDR2, MCDR2_ADDRESS, RegisterNumber); |
现在我们演绎高效C语言编写的第二招——采用数学方法来解决问题。
举例如下,求 1~100的和。
方法E
| int I , j;
for (I = 1 ;I<=100; I ++){ j += I; } |
方法F
| int I;
I = (100 * (1+100)) / 2 |
第3招:使用位操作,减少除法和取模的运算
方法G
| int I,J;
I = 257 /8; J = 456 % 32; |
方法H
| int I,J;
I = 257 >>3; J = 456 - (456 >> 4 << 4); |
在字面上好像H比G麻烦了好多,但是,仔细查看产生的汇编代码就会明白,方法G调用了基本的取模函数和除法函数,既有函数调用,还有很多汇编代码和寄存器参与运算;而方法H则仅仅是几句相关的汇编,代码更简洁,效率更高。当然,由于编译器的不同,可能效率的差距不大,但是,以我目前遇到的MS C ,ARM C 来看,效率的差距还是不小。相关汇编代码就不在这里列举了。
第4招:汇编嵌入
举例如下,将数组一赋值给数组二,要求每一字节都相符。
| char string1[1024],string2[1024]; |
方法I
| int I;
for (I =0 ;I<1024;I++) *(string2 + I) = *(string1 + I) |
方法J
| #ifdef _PC_
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 |