第一章(学海无涯) 编程技巧

xiaoxiao2025-05-16  36

1.不要怕使用全局变量

不要怕使用全局变量,许多视频游戏不让对时间要求严格的函数使用参数,而是使用一些全局变量来传递参数,例如下面函数的代码:

void Print(string str){

       cout<<str<<endl;

}

由于参数要压栈和出栈,执行这个函数体所需的时间小于调用函数所需的时间,在这里没有什么硬性要求下,建议使用全局变量,然后在调用函数,之前进行赋值.

string str;

void Print(void){

       cout<<str<<endl;

}

2.精简的函数,使用内联函数

使用内联函数,通过使用inline指示符来完全摆脱函数的调用,因为在编译的时候,内联函数会展开函数,接下来会介绍一下内联函数和普通函数的区别:

当你在一些调用内联函数的时候,编译的时候,内联函数将会在调用它的地方展开(相当于直接在这个地方写了函数体一样),这样做程序会变大,但是性能会提高.

当你调用普通函数的时候,每次执行到函数的时候,这个函数名就是函数指针会去寻找函数实体定义的地址,然后调用,所以说性能上不如内联函数,但是程序会比内联函数小.

3.尽量使用32位的变量

尽量使用32位变量而不是8位变量或16位变量,因为以前大部分Cpu都是全32位的,这就意味者它们其实讨厌处理8位或者16位的变量,实际上,由于高速缓存和其他相关内存储器的寻址变得较不规则,较小的数据会是速度下降,比如,你接下来定义的结构体:

struct CPOINT{

     short x,y;

     unsigned char c;

}

注意,定义这个结构看上去不错,但实际并非如此!首先,结构本身是5字节,这个比较糟糕的,由于没有注意字节对齐,内存寻址会出现很大的问题,当然你有可能会奇怪,其实打印出来的这个结构是6字节的,是的为了性能的考虑,结构体的特性就是自动的去字节对齐,所以不管你怎么定义结构体,性能上是没有问题,但是结构体所占的空间有可能会出现问题(定义结构体的原则,就是从字节小的到大的开始定义,尽量使用32位去定义)

typedef struct {

       short x;

       int t;

       short y;

}Point;     //这个定义是不好的(所占字节12位)

typedef struct {

       short x,y;

       int t;

}Point;     //这个好的定义(所占字节是8位)

typedef struct {

       short x;

       int t;

}Point;     //这个所占字节也是8位

至于为什么会出现这个情况,可以去多多了解一下结构体的字节对齐的规则就可以了,但是定义结构体要执行上述那个原则.

当然最好的定义方法就是直接都定义32位以上的,如下的办法

typedef struct {

       int x,y,t;

}

4.使用精简的指令

以类似RISC(精简指令集计算机)的方式来编程,换句话说,尽量简化代码,不要去复杂的嵌套.奔腾处理器特别喜欢简单指令,而不是复杂的,代码可以写的长一点,但是尽量避免各种嵌套,不要编写如下的程序

if(x+=(2*buffer[index++]))>10){}

而是应该使用以下的方法去编写程序

x +=2*buffer[index])

index ++;

if(x>10){}

这样写有2个好处,首先,它放置断点和调试代码的时候很方便.第二,奔腾处理器传送简单的指令,这样将使处理器使用更多的执行单元,并且可以执行更多的代码,复杂的代码在这方面表现的很糟糕.

5.尽量使用位运算

如果你在做关于2的乘法或者除法的时候,应该避免这么去做,比如x*8,x*1024,x/16之类的,更加好的做法就是x<<3,x<<10,x>>4,还有其他可以通过位操作可以替代的方法,把这种写法养成习惯.

6.设计高效率的算法

没有任何一种汇编语言可以是复杂度位O(n2),更好的做法是使用清楚,高效率的算法,而不是使用蛮力和枚举去解决问题.

7.杀鸡勿用牛刀

不要为简单的对象定义太多复杂的数据结构.哈希表,链表这些数据结构,虽然很好用,但是这个不意味着遇到所有的需求的时候都适用,有可能使用数组会表现的更好(偏向查找,修改).只不过有些语言是没有办法的,比如Lua只有一个table这种数据结构(底层是哈希表),所以当你在使用C,C++开发的时候还是很有必要去考虑这个问题,到底使用什么结构最合适.

8.谨慎的使用C++

使用C++应谨慎,如果你是位经验丰富的C++专家,只管去做你想做的事,但是不要疯狂地写过多的class,也尽量减少重载和继承,说到底就是代码越简单,直观比较好.很多高级语言都限制死了不能多重继承(Java,C#),所以说那些语言的设计者也不希望看到多重继承,至于具体的原因可以自行百度.

9.及时回头

当你发现之前搭的框架或者接口等等,用着很难受时,这个时候不应该考虑去修补它,而是应该考虑重构代码,重新考虑设计思路,既然前面的代码确实没有通用性,健壮性,性能等等优点时,立马收手,冷静思考一下代码应该这么去设计,不要把自己做成一个码农,作为程序员应该像艺术家一样去设计代码,代码随着时间的推移应该是不断的增值的.

 

 

 

 

 

转载请注明原文地址: https://www.6miu.com/read-5030189.html

最新回复(0)