C++秘籍:C语言高效编程的四大绝招
操作方法
- 01
数学方法解决问题 现在我们演绎高效C语言编写的第二招--采用数学方法来解决问题数学是计算机之母,没有数学的依据和基础,就没有计算机的发展,所以在编写程序的时候,采用一些数学方法会对程序的执行效率有数量级的提高举例如下,求 1~100的和 方法E: int I , j;for (I = 1 ;I<=100; I ++){j += I;} 方法F int I;I = (100 * (1+100)) / 2 这个例子是我印象最深的一个数学用例,是我的计算机启蒙老师考我的当时我只有小学三年级,可惜我当时不知道用公式 N×(N+1)/ 2 来解决这个问题方法E循环了100次才解决问题,也就是说最少用了100个赋值,100个判断,200个加法(I和j);而方法F仅仅用了1个加法,1次乘法,1次除法效果自然不言而喻所以,现在我在编程序的时候,更多的是动脑筋找规律,最大限度地发挥数学的威力来提高程序运行的效率 第三招:使用位操作 实现高效的C语言编写的第三招——使用位操作减少除法和取模的运算在计算机程序中数据的位是可以操作的最小数据单位,理论上可以用"位运算"来完成所有的运算和操作一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率举例如下: 方法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位机平台上的时候,可能会产生代码隐患所以只有在一定技术进阶的基础下才可以使用这招 第四招:汇编嵌入 高效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,string1MOV R1,string2MOV R2,#0loop:LDMIA R0!, [R3-R11]STMIA R1!, [R3-R11]ADD R2,R2,#8CMP R2, #400BNE loop}#endif 方法I是最常见的方法,使用了1024次循环;方法J则根据平台不同做了区分,在ARM平台下,用嵌入汇编仅用128次循环就完成了同样的操作这里有朋友会说,为什么不用标准的内存拷贝函数呢?这是因为在源数据里可能含有数据为0的字节,这样的话,标准库函数会提前结束而不会完成我们要求的操作这个例程典型应用于LCD数据的拷贝过程根据不同的CPU,熟练使用相应的嵌入汇编,可以大大提高程序执行的效率 虽然是必杀技,但是如果轻易使用会付出惨重的代价这是因为,使用了嵌入汇编,便限制了程序的可移植性,使程序在不同平台移植的过程中,卧虎藏龙,险象环生!同时该招数也与现代软件工程的思想相违背,只有在迫不得已的情况下才可以采用 <="" p=""> 现在我们演绎高效C语言编写的第二招--采用数学方法来解决问题数学是计算机之母,没有数学的依据和基础,就没有计算机的发展,所以在编写程序的时候,采用一些数学方法会对程序的执行效率有数量级的提高举例如下,求 1~100的和 方法E: int I , j;for (I = 1 ;I<=100; I ++){j += I;} 方法F int I;I = (100 * (1+100)) / 2 这个例子是我印象最深的一个数学用例,是我的计算机启蒙老师考我的当时我只有小学三年级,可惜我当时不知道用公式 N×(N+1)/ 2 来解决这个问题方法E循环了100次才解决问题,也就是说最少用了100个赋值,100个判断,200个加法(I和j);而方法F仅仅用了1个加法,1次乘法,1次除法效果自然不言而喻所以,现在我在编程序的时候,更多的是动脑筋找规律,最大限度地发挥数学的威力来提高程序运行的效率 第三招:使用位操作 实现高效的C语言编写的第三招——使用位操作减少除法和取模的运算在计算机程序中数据的位是可以操作的最小数据单位,理论上可以用"位运算"来完成所有的运算和操作一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率举例如下: 方法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位机平台上的时候,可能会产生代码隐患所以只有在一定技术进阶的基础下才可以使用这招 第四招:汇编嵌入 高效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,string1MOV R1,string2MOV R2,#0loop:LDMIA R0!, [R3-R11]STMIA R1!, [R3-R11]ADD R2,R2,#8CMP R2, #400BNE loop}#endif 方法I是最常见的方法,使用了1024次循环;方法J则根据平台不同做了区分,在ARM平台下,用嵌入汇编仅用128次循环就完成了同样的操作这里有朋友会说,为什么不用标准的内存拷贝函数呢?这是因为在源数据里可能含有数据为0的字节,这样的话,标准库函数会提前结束而不会完成我们要求的操作这个例程典型应用于LCD数据的拷贝过程根据不同的CPU,熟练使用相应的嵌入汇编,可以大大提高程序执行的效率 虽然是必杀技,但是如果轻易使用会付出惨重的代价这是因为,使用了嵌入汇编,便限制了程序的可移植性,使程序在不同平台移植的过程中,卧虎藏龙,险象环生!同时该招数也与现代软件工程的思想相违背,只有在迫不得已的情况下才可以采用。以上内容均出自上嵌编辑发布、转载需告知。