指针与数组处理惩罚

    添加时间:2013-6-25 点击量:

    10:04:53


     先斗劲下面两个清零数组元素的函数:


      void zero_out_array(int p, int n)


      {


        while(n-->0)


        p++ = 0;



      }


      void zero_out_array(int arr, int n)


    {


      for(int i = 0; i<n; i++)


      {


        arr[i] = 0;
      }
    }


      显然,第一个函数比第二函数处理惩罚的快一些,原因如下:


      p++ = 0; 等价于 p = 0; p++;    即p所指的变量的内容清零后,主动往后加上一个常数指向下一个变量,这个常数大小取决于你的变量类型。


      arr[i] = 0; 等价于 (arr + i) = 0; 然则实际运行景象要糟糕很多,在最底层的机械码级别是如许运行的,(arr + (i4)) = 0;(若是变量类型是int型的话),如许一来,这个地址必须一次次地反复运行策画,而在指针版本里,地址arr只需求值一次,p在全部轮回过程中每次都是按4递增的,这只是个简单的操纵。


      形象的说: 指针版本,是第一步清零,迈向第二步,第二步清零,迈向第三步……


      而第二个版本是,第一步清零,下次,从第一步往后找到(比例运算)第二步的地位清零,下次,从第一步往后找到(比例运行)第三步清零…… 

    我俩之间有着强烈的吸引力。短短几个小时后,我俩已经明白:我们的心是一个整体的两半,我俩的心灵是孪生兄妹,是知己。她让我感到更有活力,更完美,更幸福。即使她不在我身边,我依然还是感到幸福,因为她总是以这样或者那样的方式出现在我心头。——恩里克·巴里奥斯《爱的文明》
    分享到: