您的位置:首页 > 编程语言

一些简单编程技巧的总结(一)

2007-09-11 10:48 369 查看
  技巧:程序应以类似RISC(精简指令系统计算机)的形式来编写。换句话说,尽量简化你的代码,而不是使它更复杂。处理器特别喜欢简单指令,而不是复杂的指令,你的程序可以长些,但应尽量使用简单指令,使程序相对于编辑器来说更加简单些。例如,不要编写类似下面的程序:

  if((x+=(2*buffer[index++])>10)
  {
   //进行工作
  }//结束

  应这样做
  x+=(2*buffer[index]);
  index++
  if(x>10)
  {
   //进行工作
  }//结束if

  技巧:尽量使用32位变量而不用8位变量或16位变量,Pentium和之后的处理器全部都是32位的,这就意味着它们并不喜欢8位或16位的数据字符,实际上,更小的数据可能会由于超高速缓存和其他相关的内存寻址异常而使速度下降,例如,读者可能创建一个如下所示的结构:
  struct CPOINT
  {
   short x,y;
   unsigned char c;
  }//结束CPINT
  尽管这个结构看上去很好,但实际并非如此!首先,结构本身目前是一个5字符长的结构——2个short+1个char=5。这实际上是一个很差的设计,这将导致内存地址崩溃。更好的结构形式如下:
  struct CPOINT
  {
   int x,y;
   int c;
  }//结束CPINT

  技巧:使用内联功能。通过使用内联指令来完全摆脱调用功能甚至能够改善上面的技巧。内联指令不调用函数,而指示编译器将被调用函数代码放在需要调用该函数的最佳位置,这样做会使程序变得更大,但却提高了运行速度。下面是一个实例。
  inline void Plot_I (int x,int y,int color)
  {
   //在屏幕上画一个点像素
   video_buffer[x + y * MEMORY_PITCH] = color;
  }//结束Plot_I

  技巧:不要怕使用全局变量,许多视频游戏不使用大量的带有形参的、与时间相关的函数,而是使用一个全局变量来代替,例如一个函数的代码如下:
  void Plot(int x,int y,int color)
  {
   //在屏幕上画一个点像素
   video_buffer[x + y * MEMORY_PITCH] = color;
  }//结束Plot
  函数体运行的时间小于函数调用所需的时间。这是由于参数压入和弹出堆栈造成的。在这种情况下,更好的方法可能是创建一个全局变量,然后在调用前进行赋值,像下面一样:
  int gx,gy,gz,gcolor;//定义一些全局变量
  void Plot_G(void)
  {
   //使用全局变量来画一个点像素
   video_buffer(gx + gy * MEMORY_PITCH] = gcolor;
  }//结束Plot_G

  技巧:使用内联功能。通过使用内联指令来完全摆脱调用功能甚至能够改善上面的技巧。内联指令不调用函数,而指示编译器将被调用函数代码放在需要调用该函数的最佳位置,这样做会使程序变得更大,但却提高了运行速度。下面是一个实例。
  inline void Plot_I (int x,int y,int color)
  {
   //在屏幕上画一个点像素
   video_buffer[x + y * MEMORY_PITCH] = color;
  }//结束Plot_I
  注意:这里并没有使用全局变量,因为编辑器有效运行了相同类型数据的别名,但是全局变量迟早会派上用场,如果在函数调用时,一个或两个形参已改变,由于没有重新加载,所以旧的参数值有可能仍被使用。

  技巧:按照这种方式来编写代码有两个原因,首先,它允许调试程序在代码各部分之间放置断点;第二,这将更易于编译器向Pentium处理器传送简单指令,这样将使处理器使用更多的执行单元并行地处理代码。复杂的代码就比较糟糕。

  对于简单的、是2的倍数的整数乘法运算,应使用二进制移位运算。因为所有的数据在计算机中都以二进制存储,位组合向左或右移动就等同于乘法和除法运算。例如:
  int y_pos = 10
  //将y_pos乘以64
  y_pos = (y_pos << 6);//2^6=64

  相似的有

  {
  //将y_pos除以8
  y_pos = (y_pos >> 3);//1/2^3=1/8
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: