加入收藏 - 网站地图 - 网站搜索 -
阅读新闻

实现C语言高效编程的四大秘技

[日期:12-01] [字体: ]
第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 来看,效率的差距还是不小。相关汇编代码就不在这里列举了。

  运用这招需要注意的是,因为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

#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

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

  虽然是必杀技,但是如果轻易使用会付出惨重的代价。这是因为,使用了嵌入汇编,便限制了程序的可移植性,使程序在不同平台移植的过程中,卧虎藏龙,险象环生!同时该招数也与现代软件工程的思想相违背,只有在迫不得已的情况下才可以采用。切记,切记。


上一页 [1] [2]    
 
评论 】 【 推荐 】 【 打印
上一篇:周末手工:用枫叶叠出来的美丽玫瑰花
下一篇:你的MySQL安全了吗?加铸23道安全门