首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

怎么优化这个自写的strcmp函数

2012-04-02 
如何优化这个自写的strcmp函数老师讲,还可以进一步优化,请各位指点一下思路C/C++ codeint my_strcmp(const

如何优化这个自写的strcmp函数
老师讲,还可以进一步优化,请各位指点一下思路

C/C++ code
int my_strcmp(const char *s1, const char *s2){                                                while(*s1 == *s2){                                  if(*s1 == '\0'){                                             return 0;                                               }                                                  s1++;                                              s2++;                                       }                                               return *s1 - *s2;                                    }                                            


[解决办法]
C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\intel\strcmp.asm
Assembly code
        page    ,132        title   strcmp.asm - compare two strings;***;strcmp.asm - routine to compare two strings (for equal, less, or greater);;       Copyright (c) Microsoft Corporation. All rights reserved.;;Purpose:;       STRCMP compares two strings and returns an integer;       to indicate whether the first is less than the second, the two are;       equal, or whether the first is greater than the second, respectively.;       Comparison is done byte by byte on an UNSIGNED basis, which is to;       say that Null (0) is less than any other character (1-255).;;*******************************************************************************        .xlist        include cruntime.inc        .listpage;***;strcmp - compare two strings, returning less than, equal to, or greater than;;Purpose:;       Compares two string, determining their lexical order.  Unsigned;       comparison is used.;;       Algorithm:;          int strcmp ( src , dst );                  unsigned char *src;;                  unsigned char *dst;;          {;                  int ret = 0 ;;;                  while( ! (ret = *src - *dst) && *dst);                          ++src, ++dst;;;                  if ( ret < 0 );                          ret = -1 ;;                  else if ( ret > 0 );                          ret = 1 ;;;                  return( ret );;          };;Entry:;       const char * src - string for left-hand side of comparison;       const char * dst - string for right-hand side of comparison;;Exit:;       AX < 0, 0, or >0, indicating whether the first string is;       Less than, Equal to, or Greater than the second string.;;Uses:;       CX, DX;;Exceptions:;;*******************************************************************************        CODESEG        public  strcmpstrcmp  proc \        str1:ptr byte, \        str2:ptr byte        OPTION PROLOGUE:NONE, EPILOGUE:NONE        .FPO    ( 0, 2, 0, 0, 0, 0 )        mov     edx,[esp + 4]   ; edx = src        mov     ecx,[esp + 8]   ; ecx = dst        test    edx,3        jnz     short dopartial        align   4dodwords:        mov     eax,[edx]        cmp     al,[ecx]        jne     short donene        or      al,al        jz      short doneeq        cmp     ah,[ecx + 1]        jne     short donene        or      ah,ah        jz      short doneeq        shr     eax,16        cmp     al,[ecx + 2]        jne     short donene        or      al,al        jz      short doneeq        cmp     ah,[ecx + 3]        jne     short donene        add     ecx,4        add     edx,4        or      ah,ah        jnz     short dodwords        align   4doneeq:        xor     eax,eax        ret        align   4donene:        ; The instructions below should place -1 in eax if src < dst,        ; and 1 in eax if src > dst.        sbb     eax,eax        sal     eax,1        add     eax,1        ret        align   4dopartial:        test    edx,1        jz      short doword        mov     al,[edx]        add     edx,1        cmp     al,[ecx]        jne     short donene        add     ecx,1        or      al,al        jz      short doneeq        test    edx,2        jz      short dodwords        align   4doword:        mov     ax,[edx]        add     edx,2        cmp     al,[ecx]        jne     short donene        or      al,al        jz      short doneeq        cmp     ah,[ecx + 1]        jne     short donene        or      ah,ah        jz      short doneeq        add     ecx,2        jmp     short dodwordsstrcmp  endp        end 


[解决办法]

C/C++ code
int my_strcmp(const char *s1, const char *s2){                                                while(*s1 == *s2){                             //  if(*s1 == '\0'){ 注释掉这3句,就是在你代码效率基础上进一步优化                            //     return 0;                                       //     }                                                  s1++;                                              s2++;                                       }                                               return *s1 - *s2;                                    } 也可以这样 int my_strcmp(const char *s1, const char *s2){    while (*s1++ == *s2++)     {     }     return *s1 - *s2;}这是对你代码进行优化,第二个只是对代码进行精简。 

热点排行