新闻中心

EEPW首页 > 嵌入式系统 > 牛人业话 > 《C与指针》读书笔记七

《C与指针》读书笔记七

作者:时间:2016-08-17来源:网络收藏

  在这本书中作者专门讨论了数组的下标和的关系。而且总结了一个结论:“假定两种方法都是正确的,下标绝对不会比更有效率,但有时会比下标更有效率。”这个问题我以前没有注意到过。并且作者从编译结果的角度证实自己的结论。

本文引用地址:http://www.eepw.com.cn/article/201608/295622.htm

  int array[10] ,a;

  for( a =0 ;a < 10; a+=1 )

  array[a ] =0;

  这是一个数组的初始化,将整个数组初始化为0。array[a ]的定位方法比较特别,按照作者的意思是在计算array[a ]的地址时是arrary的值加上a乘于int的长度值得到的。所以每次数组元素的访问都包含一次乘法运算。在基础数字电路中我们知道加法器是比较容易实现的,乘法比较不太容易实现。而且乘法运算指令比加法运算指令周期要长。也就是作者认为下标访问方法效率有提高的空间。

  int array[10] ,*ap;

  for( ap = array ;ap < array + 10; ap++ )

  *ap = 0;

  在for中每次循环只需将ap自增1即可。彻底抛弃了乘法运算。提高了运算效率。但是如果基础比较薄弱的程序员应该接收不了此种写法,因为可读性明显降低。如果对程序时效和节能方面没有特殊的要求,那么我建议还是使用易读性强的编写方法。

  在书的146页作者介绍一系列优化方法。作者认为最优的复制两个数组的方法如下:

  void try5( )

  {

  register int *p1, *p2;

  for( p1 = x, p2 = y; p1 < &x[SIZE]; )

  *p1++ = *p2++;

  }

  编译成最终代码非常简练。

  在该章节最后,作者专门介绍这样做实际意义。

  数组名作为参数传递函数时,也就是将数组的首个元素地址复制给了函数的接收参数。通过该参数可以对整个数组进行操作。

  作者再次举例实现了一个字符串复制的函数。

  void strcpy( char *buffer, char const *string )

  {

  while(( *buffer++ = *string)!='')

  ;

  }

  实现字符串的复制其实非常简单,我是第一次见到如此精炼的代码。

  数组初始化确实需要时间,如果数组足够大,那么需要的时间将比较可观。静态数组只初始化一次,但是自动变量却是函数每次执行都要重新初始化的。比如:

  static int arrary[5] = { 0, 1, 2, 3, 4 };

  int arrary[5] = { 0, 1, 2, 3, 4 };

  两种声明的区别非常明显。static int arrary[5]在函数执行之前就已经存在。 所以并不需要每次初始化。而int arrary[5]则需要函数每次执行时重新在栈中构建。如果每次都需要该数组,可以声明为静态。

  但是这样做应该也有弊端,就是堆中,而且一直存在。内存开销必然增大。



关键词: C 指针

评论


相关推荐

技术专区

关闭