• 指针与下标


    假定这两种方法都是正确的,下标绝不会比指针更有效率,但指针有时会比下标更有效率。

    ——《C和指针》

     

    先上代码:

     

    #if 0   /*下标*/

            for( j=0; j<numFrame; 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<numWord; 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<numFrame; 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<numWord; 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),并且没有乘法运算,所以效率就体现出来了。

     

  • 相关阅读:
    Python列表和元组知识点
    Python 字符串操作常用知识点
    ng-alain的sf如何自定义部件
    Spring-手写Spring注解版本事务,Spring事物的七大传播行为
    Spring-SpringAOP原理,手写Spring事务框架
    JVM性能优化--类加载器,手动实现类的热加载
    JVM性能优化--字节码技术
    JVM性能优化--JVM参数配置,使用JMeter简单测试配合说明参数调优
    JVM性能优化--Java的垃圾回收机制
    设计模式之原型模式、策略模式、观察者模式
  • 原文地址:https://www.cnblogs.com/guanguangreat/p/6188115.html
Copyright © 2020-2023  润新知