指针与下标
假定这两种方法都是正确的,下标绝不会比指针更有效率,但指针有时会比下标更有效率。
——《C和指针》
先上代码:
#if 0 /*下标*/
for( j=0; j { pDesc[j].NextFDesc = &pDesc[j+1]; pDesc[j].FControl = 0; pDesc[j].FStatus = 0x0404; for( i=0; i<4; i++ ) { if(0==i%2) dst=dstEven++; else dst=dstOdd++; pDesc[j].InOutBDesc[i].BPtr = (UINT32)(src++); pDesc[j].InOutBDesc[i].BCtrl = 4; pDesc[j].InOutBDesc[i+4].BPtr = (UINT32)(dst); pDesc[j].InOutBDesc[i+4].BCtrl = 4; } } pDesc[numFrame].NextFDesc = NULL; pDesc[numFrame].FControl = 0; pDesc[numFrame].FStatus = (numWord<<8)|(numWord); for( i=0; i { if(0==i%2) dst=dstEven++; else dst=dstOdd++; pDesc[numFrame].InOutBDesc[i].BPtr = (UINT32)(src++); pDesc[numFrame].InOutBDesc[i].BCtrl = 4; pDesc[numFrame].InOutBDesc[i+numWord].BPtr = (UINT32)(dst); pDesc[numFrame].InOutBDesc[i+numWord].BCtrl = 4; } #else /*指针*/ for( j=0; j { pDesc->NextFDesc = pDesc+1; pDesc->FControl = 0; pDesc->FStatus = 0x0404; for( i=0; i<4; i++ ) { if(0==i%2) dst=dstEven++; else dst=dstOdd++; pDesc->InOutBDesc[i].BPtr = (UINT32)(src++); pDesc->InOutBDesc[i].BCtrl = 4; pDesc->InOutBDesc[i+4].BPtr = (UINT32)(dst); pDesc->InOutBDesc[i+4].BCtrl = 4; } pDesc++; } pDesc->NextFDesc = NULL; pDesc->FControl = 0; pDesc->FStatus = (numWord<<8)|(numWord); for( i=0; i { if(0==i%2) dst=dstEven++; else dst=dstOdd++; pDesc->InOutBDesc[i].BPtr = (UINT32)(src++); pDesc->InOutBDesc[i].BCtrl = 4; pDesc->InOutBDesc[i+numWord].BPtr = (UINT32)(dst); pDesc->InOutBDesc[i+numWord].BCtrl = 4; } #endif 以上是某项目源码的一部分,实现一个结构体(pDesc是一个指向结构体数组的指针)的初始化。以上利用了下标和指针分别实现相同的功能,代码量差不多,但是它们在效率率上存在很大的差距,在项目中,使用指针的方法的效率较下标提高了约20%。为什么呢? 明显上面代码中pDesc出现的频率较高,两种方法间效率的差距就体现在访问pDesc 这个地址的效率上。下标pDesc [j]这种方法,每次进行访问都要经过pDesc+j*sizeof(tDesc)计算得到pDesc的地址,如果访问的次数较大时,这将产生较大的时耗。而指针的方法是在一次大循环中才有一次pDesc++,就是pDesc+sizeof(tDesc),并且没有乘法运算,所以效率就体现出来了。