• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            woaidongmao

            文章均收錄自他人博客,但不喜標(biāo)題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
            隨筆 - 1469, 文章 - 0, 評(píng)論 - 661, 引用 - 0
            數(shù)據(jù)加載中……

            指針訪問與數(shù)組訪問的效率分析

             

            http://blog.csdn.net/pony_maggie/article/details/6748662

             

            總看到網(wǎng)上一些人說指針訪問比數(shù)組訪問效率高, 但很少人解釋其中的原理, 這篇文章從匯編級(jí)別上分析一下原因.


            我用一個(gè)"reverse"函數(shù)來作為例子, 分別用指針和數(shù)組的形式來實(shí)現(xiàn)這個(gè)函數(shù).

            view plain

            1. //指針訪問 
            2. void reverse(char *pStr,int nLen) 
            3.  char *pStart=pStr;//指向字符串開始 
            4.  char *pEnd=pStr+nLen-1;//指向字符串結(jié)尾 
            5.  char chTmp; 
            6.   
            7.  while(pEnd > pStart) 
            8. {  
            9.   chTmp = *pStart; 
            10.   *pStart = *pEnd; 
            11.   *pEnd = chTmp; 
            12.    
            13.   pStart++; 
            14.   pEnd--; 



            這是上面的函數(shù)在vc6下的反匯編代碼,我加了一些注釋方便理解

            view plain

            1. 19:   void reverse(char *pStr,int nLen) 
            2. 20:   { 
            3. 00401070   push        ebp 
            4. 00401071   mov         ebp,esp 
            5. 00401073   sub         esp,4Ch 
            6. 00401076   push        ebx 
            7. 00401077   push        esi 
            8. 00401078   push        edi 
            9. 00401079   lea         edi,[ebp-4Ch] 
            10. 0040107C   mov         ecx,13h 
            11. 00401081   mov         eax,0CCCCCCCCh 
            12. 00401086   rep stos    dword ptr [edi]//調(diào)用子函數(shù)時(shí)進(jìn)堆棧保存信息.  
            13.  
            14. 00401088   mov         eax,dword ptr [ebp+8] 
            15. 0040108B   mov         dword ptr [ebp-4],eax//char *pStart=pStr; 
            16.  
            17. 0040108E   mov         ecx,dword ptr [ebp+0Ch] 
            18. 00401091   mov         edx,dword ptr [ebp+8] 
            19. 00401094   lea         eax,[edx+ecx-1] 
            20. 00401098   mov         dword ptr [ebp-8],eax//char *pEnd=pStr+nLen-1; 
            21.     
            22. 0040109B   mov         ecx,dword ptr [ebp-8] 
            23. 0040109E   cmp         ecx,dword ptr [ebp-4]//while(pEnd > pStart) 
            24. 004010A1   jbe         reverse+61h (004010d1) 
            25.        
            26. 004010A3   mov         edx,dword ptr [ebp-4]//chTmp = *pStart; 
            27. 004010A6   mov         al,byte ptr [edx]//取一個(gè)字節(jié) 
            28. 004010A8   mov         byte ptr [ebp-0Ch],al 
            29.      
            30. 004010AB   mov         ecx,dword ptr [ebp-4]//*pStart = *pEnd; 
            31. 004010AE   mov         edx,dword ptr [ebp-8] 
            32. 004010B1   mov         al,byte ptr [edx]//pEnd中取一個(gè)字節(jié) 
            33. 004010B3   mov         byte ptr [ecx],al 
            34.          
            35. 004010B5   mov         ecx,dword ptr [ebp-8]// *pEnd = chTmp; 
            36. 004010B8   mov         dl,byte ptr [ebp-0Ch] 
            37. 004010BB   mov         byte ptr [ecx],dl 
            38.           
            39. 004010BD   mov         eax,dword ptr [ebp-4]//pStart++; 
            40. 004010C0   add         eax,1 
            41. 004010C3   mov         dword ptr [ebp-4],eax 
            42.            
            43. 004010C6   mov         ecx,dword ptr [ebp-8]//pEnd--; 
            44. 004010C9   sub         ecx,1 
            45. 004010CC   mov         dword ptr [ebp-8],ecx 


             

            view plain

            1. //數(shù)組訪問 
            2. void reverse(char *pStr,int nLen) 
            3.  int i = 0; 
            4.  int j = nLen-1; 
            5.  char chTmp; 
            6.   
            7.  while(j>i) 
            8. {  
            9.   chTmp=pStr[i]; 
            10.   pStr[i]=pStr[j]; 
            11.   pStr[j]=chTmp; 
            12.    
            13.   i++; 
            14.   j--;     


             

            這是上面代碼的反匯編

            view plain

            1. 19:   void reverse(char *pStr,int nLen) 
            2. 20:   { 
            3. 004010D0   push        ebp 
            4. 004010D1   mov         ebp,esp 
            5. 004010D3   sub         esp,4Ch 
            6. 004010D6   push        ebx 
            7. 004010D7   push        esi 
            8. 004010D8   push        edi 
            9. 004010D9   lea         edi,[ebp-4Ch] 
            10. 004010DC   mov         ecx,13h 
            11. 004010E1   mov         eax,0CCCCCCCCh 
            12. 004010E6   rep stos    dword ptr [edi] 
            13.  
            14. 004010E8   mov         dword ptr [ebp-4],0 
            15.  
            16. 004010EF   mov         eax,dword ptr [ebp+0Ch] 
            17. 004010F2   sub         eax,1 
            18. 004010F5   mov         dword ptr [ebp-8],eax 
            19.   
            20. 004010F8   mov         ecx,dword ptr [ebp-8] 
            21. 004010FB   cmp         ecx,dword ptr [ebp-4] 
            22. 004010FE   jle         reverse+6Ah (0040113a
            23.      
            24. 00401100   mov         edx,dword ptr [ebp+8] 
            25. 00401103   add         edx,dword ptr [ebp-4]//注意這里 
            26. 00401106   mov         al,byte ptr [edx] 
            27. 00401108   mov         byte ptr [ebp-0Ch],al 
            28.  
            29. 0040110B   mov         ecx,dword ptr [ebp+8] 
            30. 0040110E   add         ecx,dword ptr [ebp-4]//注意這里 
            31. 00401111   mov         edx,dword ptr [ebp+8] 
            32. 00401114   add         edx,dword ptr [ebp-8]//注意這里 
            33. 00401117   mov         al,byte ptr [edx] 
            34. 00401119   mov         byte ptr [ecx],al 
            35.  
            36. 0040111B   mov         ecx,dword ptr [ebp+8] 
            37. 0040111E   add         ecx,dword ptr [ebp-8]//注意這里 
            38. 00401121   mov         dl,byte ptr [ebp-0Ch] 
            39. 00401124   mov         byte ptr [ecx],dl 
            40.  
            41. 00401126   mov         eax,dword ptr [ebp-4] 
            42. 00401129   add         eax,1 
            43. 0040112C   mov         dword ptr [ebp-4],eax 
            44.  
            45. 0040112F   mov         ecx,dword ptr [ebp-8] 
            46. 00401132   sub         ecx,1 
            47. 00401135   mov         dword ptr [ebp-8],ecx 


            兩個(gè)函數(shù)反匯編后的代碼基本是一致的,但第二段匯編中多了幾個(gè)add語句, 這是因?yàn)樵谟脭?shù)組下標(biāo)的形式訪問字符串時(shí),總要對(duì)數(shù)組的首地址做加減操作才能定位到想要的值, 而指針的實(shí)現(xiàn)則一開始就copy了一個(gè)首地址,不需要再用加減來定位.顯然在這個(gè)例子中,用指針來實(shí)現(xiàn)reverse函數(shù)效率要高.

             

            posted on 2011-09-07 18:06 肥仔 閱讀(1690) 評(píng)論(2)  編輯 收藏 引用 所屬分類: C++ 基礎(chǔ)

            評(píng)論

            # re: 指針訪問與數(shù)組訪問的效率分析  回復(fù)  更多評(píng)論   

            效率高不假 但指針自增自減會(huì)帶來更多的錯(cuò)誤 還有可能覆蓋了系統(tǒng)重要內(nèi)存
            2011-11-28 09:30 | jemmyLiu

            # re: 指針訪問與數(shù)組訪問的效率分析[未登錄]  回復(fù)  更多評(píng)論   

            喲西 。
            2013-02-15 21:52 | mengjiangtao
            久久久WWW成人免费精品| 久久国产视频网| 偷偷做久久久久网站| 久久99精品国产麻豆| 久久久久国产亚洲AV麻豆| 日韩va亚洲va欧美va久久| 99精品国产在热久久无毒不卡| 99久久精品无码一区二区毛片 | 亚洲欧美一区二区三区久久| 国产精品久久久久AV福利动漫| 中文字幕亚洲综合久久2| 久久亚洲AV成人无码软件| 99久久99久久精品免费看蜜桃| 伊人久久国产免费观看视频| 国产成人精品久久综合| 久久精品国产99国产电影网 | 精品人妻伦九区久久AAA片69| 国产一区二区精品久久| 伊人热热久久原色播放www| 欧美久久综合性欧美| 久久精品国产99国产精偷| 日日狠狠久久偷偷色综合96蜜桃| 成人综合伊人五月婷久久| 久久精品人妻中文系列| 欧美午夜A∨大片久久| 精品国产一区二区三区久久蜜臀| 亚洲乱亚洲乱淫久久| 久久国产精品77777| 久久本道伊人久久| 久久精品九九亚洲精品| 国产精品久久久久蜜芽| 久久99精品久久久久久9蜜桃| 精品综合久久久久久888蜜芽| 亚洲色大成网站www久久九| 97久久久久人妻精品专区 | 久久91精品综合国产首页| 久久不射电影网| 国产精品伦理久久久久久| 精品久久久久久久久久中文字幕 | 99久久久精品| 亚洲一本综合久久|