c语言代码:编写高效简洁的C语言代码

  第招:以空间换时间

  计算机中最大矛盾是空间和时间矛盾那么从这个角度出发逆向思维来考虑效率问题我们就有了解决问题第1招--以空间换时间比如说赋值:

  思路方法A:通常办法

# LEN 32
char 1 [LEN];
mem (1,0,LEN);
strcpy (1,"This is a example!!");


  思路方法B:
const char 2[LEN] ="This is a example!";
char * cp;
cp = 2 ;


  使用时候可以直接用指针来操作

  从上面例子可以看出A和B效率是不能比在同样存储空间下B直接使用指针就可以操作了而A需要两个才能完成B缺点在于灵活性没有A好在需要频繁更改串内容时候A具有更好灵活性;如果采用思路方法B则需要预存许多虽然占用了大量内存但是获得了执行高效率

  如果系统实时性要求很高内存还有那我推荐你使用该招数该招数变招--使用宏而不是举例如下:

  思路方法C:
# bwMCDR2_ADDRESS 4
# bsMCDR2_ADDRESS 17
BIT_MASK( __bf)
{
  ((1U << (bw ## __bf)) - 1)<< (bs ## __bf);
}
void SET_BITS( __dst,
__bf, __val)
{
 __dst = ((__dst) & ~(BIT_MASK(__bf))) |
\
 (((__val) << (bs ## __bf))
& (BIT_MASK(__bf))))
}

SET_BITS(MCDR2, MCDR2_ADDRESS,RegisterNumber);


  思路方法D:
# bwMCDR2_ADDRESS 4
# bsMCDR2_ADDRESS 17
# bmMCDR2_ADDRESS BIT_MASK(MCDR2_ADDRESS)
# BIT_MASK(__bf)
(((1U << (bw ## __bf)) - 1)
<< (bs ## __bf))
# SET_BITS(__dst, __bf, __val)
\
((__dst) = ((__dst) & ~(BIT_MASK(__bf)))
| \
(((__val) << (bs ## __bf))
& (BIT_MASK(__bf))))

SET_BITS(MCDR2, MCDR2_ADDRESS,
RegisterNumber);


  和宏区别就在于占用了大量空间占用了时间大家要知道是要使用系统栈来保存数据如果编译器里有栈检查选项般在头会嵌入些汇编语句对当前栈进行检查;同时CPU也要在时保存和恢复当前现场进行压栈和弹栈操作所以需要些CPU时间

  而宏不存在这个问题仅仅作为预先写好代码嵌入到当前不会产生所以仅仅是占用了空间在频繁个宏时候该现象尤其突出

  D思路方法是我看到最好置位操作是ARM公司源码部分在短短 3行内实现了很多功能几乎涵盖了所有位操作功能C思路方法是其变体其中滋味还需大家仔细体会
第 2招:数学思路方法解决问题

  现在我们演绎高效C语言编写第 2招--采用数学思路方法来解决问题数学是计算机的母没有数学依据和基础就没有计算机发展所以在编写时候采用些数学思路方法会对执行效率有数量级提高举例如下求 1~100

  思路方法E:
I , j;
for (I = 1 ;I<=100; I )
{
 j I;
}


  思路方法F
I;
I = (100 * (1+100)) / 2


  这个例子是我印象最深个数学用例是我计算机启蒙老师考我当时我只有小学 3年级可惜我当时不知道用公式 N×(N+1)/ 2 来解决这个问题思路方法E循环了100次才解决问题也就是说最少用了100个赋值100个判断200个加法(I和j);而思路方法F仅仅用了1个加法1 次乘法1次除法效果自然不言而喻所以现在我在编时候更多是动脑筋找规律最大限度地发挥数学威力来提高运行效率

  第 3招:使用位操作

  实现高效C语言编写第 3招——使用位操作减少除法和取模运算在计算机中数据位是可以操作最小数据单位理论上可以用"位运算"来完成所有运算和操作位操作是用来控制硬件或者做数据变换使用但是灵活位操作可以有效地提高运行效率举例如下:

  思路方法G
I,J;
I = 257 /8;
J = 456 % 32;


  思路方法H
I,J;
I = 257 >>3;
J = 456 - (456 >> 4 << 4);


  在字面上好像H比G麻烦了好多但是仔细查看产生汇编代码就会明白思路方法G了基本取模和除法既有还有很多汇编代码和寄存器参和运算;而思路方法H则仅仅是几句相关汇编代码更简洁效率更高当然由于编译器区别可能效率差距不大但是以我目前遇到MS C ,ARM C 来看效率差距还是不小相关汇编代码就不在这里列举了

  运用这招需要注意CPU区别而产生问题比如说在PC上用这招编写并在PC上调试通过在移植到个16位机平台上时候可能会产生代码隐患所以只有在定技术进阶基础下才可以使用这招

  第 4招:汇编嵌入

  高效C语言编程必杀技第 4招——嵌入汇编"在熟悉汇编语言人眼里C语言编写都是垃圾"这种说法虽然偏激了但是却有它道理汇编语言是效率最高计算机语言但是不可能靠着它来写个操作系统吧?所以为了获得高效率我们只好采用变通思路方法--嵌入汇编混合编程举例如下赋值给 2,要求每字节都相符
char 1[1024],2[1024];


  思路方法I
I;
for (I =0 ;I<1024;I)
 *(2 + I) = *(1 + I)


  思路方法J
#def _PC_
I;
for (I =0 ;I<1024;I)
*(2 + I) = *(1 + I);
#
#def _ARM_
__asm
{
 MOV R0,1
 MOV R1,2
 MOV R2,#0
loop:
 LDMIA R0!, [R3-R11]
 STMIA R1!, [R3-R11]
 ADD R2,R2,#8
 CMP R2, #400
 BNE loop
}
#end


  思路方法I是最常见思路方法使用了1024次循环;思路方法J则根据平台区别做了区分在ARM平台下用嵌入汇编仅用128次循环就完成了同样操作这里有朋友会说为什么不用标准内存拷贝呢?这是在源数据里可能含有数据为0字节这样标准库会提前结束而不会完成我们要求操作这个例程典型应用于LCD数据拷贝过程根据区别CPU熟练使用相应嵌入汇编可以大大提高执行效率

  虽然是必杀技但是如果轻易使用会付出惨重代价这是使用了嵌入汇编便限制了可移植性使在区别平台移植过程中卧虎藏龙险象环生!同时该招数也和现代软件Software工程思想相违背只有在迫不得已情况下才可以采用
Tags:  c语言编写程序 c语言编写 c语言源代码 c语言代码

延伸阅读

最新评论

发表评论