皮皮网
皮皮网

【筹码神龙指标源码】【asctime函数源码】【shadowsocks 源码分析】卧虎藏龙2源码_卧虎藏龙手游源码

来源:python部署非源码 发表时间:2024-12-22 15:23:27

1.如何优化C++程序代码编写
2.什么**比较好看?卧虎卧虎

卧虎藏龙2源码_卧虎藏龙手游源码

如何优化C++程序代码编写

       ç¬¬ä¸€æ‹›ï¼šä»¥ç©ºé—´æ¢æ—¶é—´

       è®¡ç®—机程序中最大的矛盾是空间和时间的矛盾,那么,从这个角度出发逆向思维来考虑程序的效率问题,我们就有了解决问题的第1招--以空间换时间。比如说字符串的赋值:

方法A:通常的办法

#define LEN 

       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 ;

       ä½¿ç”¨çš„时候可以直接用指针来操作。

       ä»Žä¸Šé¢çš„例子可以看出,A和B的效率是不能比的。在同样的存储空间下,B直接使用指针就可以操作了,而A需要调用两个字符函数才能完成。B的缺点在于灵活性没有A好。在需要频繁更改一个字符串内容的时候,A具有更好的灵活性;如果采用方法B,则需要预存许多字符串,虽然占用了大量的内存,但是获得了程序执行的高效率。

       å¦‚果系统的实时性要求很高,内存还有一些,那我推荐你使用该招数。

第二招: 使用宏而不是函数。

       è¿™ä¹Ÿæ˜¯ç¬¬ä¸€æ‹›çš„变招。函数和宏的区别就在于,宏占用了大量的空间,而函数占用了时间。大家要知道的是,函数调用是要使用系统的栈来保存数据的,如果编译器里有栈检查选 项,一般在函数的头会嵌入一些汇编语句对当前栈进行检查;同时,CPU也要在函数调用时保存和恢复当前的现场,进行压栈和弹栈操作,所以,函数调用需要一 些CPU时间。 而宏不存在这个问题。宏仅仅作为预先写好的代码嵌入到当前程序,不会产生函数调用,所以仅仅是占用了空间,在频繁调用同一个宏的时候,该现象尤其突出。

       ä¸¾ä¾‹å¦‚下:

方法C:

#define bwMCDR2_ADDRESS 4

       #define bsMCDR2_ADDRESS 

       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 

       #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);

       D方法是我看到的最好的置位操作函数,是arm公司源码的一部分,在短短的三行内实现了很多功能,几乎涵盖了所有的位操作功能。C方法是其变体,其中滋味还需大家仔细体会。

       ç¬¬ä¸‰æ‹›ï¼šæ•°å­¦æ–¹æ³•è§£å†³é—®é¢˜

       çŽ°åœ¨æˆ‘们演绎高效C语言编写的第二招--采用数学方法来解决问题。数学是计算机之母,没有数学的依据和基础,就没有计算机的发展,所以在编写程序的时候,采用一些数学方法会对程序的执行效率有数量级的提高。举例如下,求 1~的和。

方法E:

int I , j;

       for (I = 1 ;I<=; I ++)

       {

       j += I;

       }

方法F

int I;

       I = ( * (1+)) / 2

       è¿™ä¸ªä¾‹å­æ˜¯æˆ‘印象最深的一个数学用例,是我的计算机启蒙老师考我的。当时我只有小学三年级,可惜我当时不知道用公式 N×(N+1)/ 2 来解决这个问题。方法E循环了次才解决问题,也就是说最少用了个赋值,个判断,个加法(I和j);而方法F仅仅用了1个加法,1 次乘法,1次除法。效果自然不言而喻。所以,现在我在编程序的时候,更多的是动脑筋找规律,最大限度地发挥数学的威力来提高程序运行的效率。

第四招:使用位操作

       ä½¿ç”¨ä½æ“ä½œã€‚减少除法和取模的运算。在计算机程序中数据的位是可以操作的最小数据单位,理论上可以用"位运算"来完成所有的运算和操作。一般的位操作是用来控制硬件的,或者做数据变换使用,但是,灵活的位操作可以有效地提高程序运行的效率。举例如下:

方法G

int I,J;

       I =  /8;

       J =  % ;

方法H

int I,J;

       I =  >>3;

       J =  - ( >> 4 << 4);

       åœ¨å­—面上好像H比G麻烦了好多,但是,仔细查看产生的汇编代码就会明白,方法G调用了基本的取模函数和除法函数,既有函数调用,还有很多汇编代码和寄存器参与运算;而方法H则仅仅是几句相关的汇编,代码更简洁,效率更高。当然,由于编译器的不同,可能效率的差距不大,但是,以我目前遇到的MS C ,arm C 来看,效率的差距还是不小。

       å¯¹äºŽä»¥2的指数次方为"*"、"/"或"%"因子的数学运算,转化为移位运算"<< >>"通常可以提高算法效率。因为乘除运算指令周期通常比移位运算大。

       C语言位运算除了可以提高运算效率外,在嵌入式系统的编程中,它的另一个最典型的应用,而且十分广泛地正在被使用着的是位间的与(&)、或(|)、非(~)操作,这跟嵌入式系统的编程特点有很大关系。我们通常要对硬件寄存器进行位设置,譬如,我们通过将AMER型处理器的中断屏蔽控制寄存器的第低6位设置为0(开中断2),最通用的做法是:

       #define INT_I2_MASK 0x

       wTemp = inword(INT_MASK);

       outword(INT_MASK, wTemp &~INT_I2_MASK);

       è€Œå°†è¯¥ä½è®¾ç½®ä¸º1的做法是:

       #define INT_I2_MASK 0x

       wTemp = inword(INT_MASK);

       outword(INT_MASK, wTemp | INT_I2_MASK);

       åˆ¤æ–­è¯¥ä½æ˜¯å¦ä¸º1的做法是:

       #define INT_I2_MASK 0x

       wTemp = inword(INT_MASK);

       if(wTemp & INT_I2_MASK)

       {

       â€¦ /* 该位为1 */

       }

       è¿ç”¨è¿™æ‹›éœ€è¦æ³¨æ„çš„是,因为CPU的不同而产生的问题。比如说,在PC上用这招编写的程序,并在PC上调试通过,在移植到一个位机平台上的时候,可能会产生代码隐患。所以只有在一定技术进阶的基础下才可以使用这招。

第五招:汇编嵌入

       åœ¨ç†Ÿæ‚‰æ±‡ç¼–语言的人眼里,C语言编写的程序都是垃圾"。这种说法虽然偏激了一些,但是却有它的道理。汇编语言是效率最高的计算机语言,但是,不可能靠着它来写一个操作系统吧?所以,为了获得程序的高效率,我们只好采用变通的方法--嵌入汇编,混合编程。嵌入式C程序中主要使用在线汇编,即在C程序中直接插入_asm{ }内嵌汇编语句。

       ä¸¾ä¾‹å¦‚下,将数组一赋值给数组二,要求每一字节都相符。

       char string1[],string2[];

方法I

       int I;

       for (I =0 ;I<;I++)

       *(string2 + I) = *(string1 + I)

方法J

       #ifdef _PC_

       int I;

       for (I =0 ;I<;I++)

       *(string2 + I) = *(string1 + I);

       #else

       #ifdef _arm_

       __asm

       {

       MOV R0,string1

       MOV R1,string2

       MOV R2,#0

       loop:

       LDMIA R0!, [R3-R]

       STMIA R1!, [R3-R]

       ADD R2,R2,#8

       CMP R2, #

       BNE loop

       }

       #endif

       å†ä¸¾ä¸ªä¾‹å­ï¼š

       /* 把两个输入参数的值相加,结果存放到另外一个全局变量中 */

       int result;

       void Add(long a, long *b)

       {

       _asm

       {

       MOV AX, a

       MOV BX, b

       ADD AX, [BX]

       MOV result, AX

       }

       }

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

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

第六招, 使用寄存器变量

       å½“对一个变量频繁被读写时,需要反复访问内存,从而花费大量的存取时间。为此,C语言提供了一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写,从而提高效率。寄存器变量的说明符是register。对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量,而循环计数是应用寄存器变量的最好候选者。

       (1) 只有局部自动变量和形参才可以定义为寄存器变量。因为寄存器变量属于动态存储方式,凡需要采用静态存储方式的量都不能定义为寄存器变量,包括:模块间全局变量、模块内全局变量、局部static变量;

       (2) register是一个"建议"型关键字,意指程序建议该变量放在寄存器中,但最终该变量可能因为条件不满足并未成为寄存器变量,而是被放在了存储器中,但编译器中并不报错(在C++语言中有另一个"建议"型关键字:inline)。

       ä¸‹é¢æ˜¯ä¸€ä¸ªé‡‡ç”¨å¯„存器变量的例子:

       /* 求1+2+3+….+n的值 */

       WORD Addition(BYTE n)

       {

       register i,s=0;

       for(i=1;i<=n;i++)

       {

       s=s+i;

       }

       return s;

       }

       æœ¬ç¨‹åºå¾ªçŽ¯n次,i和s都被频繁使用,因此可定义为寄存器变量。

第七招: 利用硬件特性

       é¦–先要明白CPU对各种存储器的访问速度,基本上是:

       CPU内部RAM > 外部同步RAM > 外部异步RAM > FLASH/ROM

       å¯¹äºŽç¨‹åºä»£ç ï¼Œå·²ç»è¢«çƒ§å½•åœ¨FLASH或ROM中,我们可以让CPU直接从其中读取代码执行,但通常这不是一个好办法,我们最好在系统启动后将FLASH或ROM中的目标代码拷贝入RAM中后再执行以提高取指令速度;

       å¯¹äºŽUART等设备,其内部有一定容量的接收BUFFER,我们应尽量在BUFFER被占满后再向CPU提出中断。例如计算机终端在向目标机通过RS-传递数据时,不宜设置UART只接收到一个BYTE就向CPU提中断,从而无谓浪费中断处理时间;

       å¦‚果对某设备能采取DMA方式读取,就采用DMA读取,DMA读取方式在读取目标中包含的存储信息较大时效率较高,其数据传输的基本单位是块,而所传输的数据是从设备直接送入内存的(或者相反)。DMA方式较之中断驱动方式,减少了CPU 对外设的干预,进一步提高了CPU与外设的并行操作程度。

       ä»¥ä¸Šå°±æ˜¯æˆ‘总结的如何优化C代码的方法了。

什么**比较好看?

       海盗4、蓝精灵、藏龙藏龙赛车总动员2、源码源码源代码、手游筹码神龙指标源码变形金刚3、卧虎卧虎哈利波特7下、藏龙藏龙asctime函数源码美国队长、源码源码狂暴飞车、手游永无止境、卧虎卧虎猿族崛起、藏龙藏龙X战警第一战、源码源码绿灯侠、手游死神来了5、卧虎卧虎shadowsocks 源码分析武侠、藏龙藏龙窃听风云2、源码源码无价之宝、solr 源码结构巴黎宝贝、全城热恋、大武生、分站导航源码孤胆特工、倾城之泪、龙门飞甲、金陵十三钗、鸿门宴、天堂之吻、夏日恋神马、青春失乐园

相关栏目:百科