によって定義されていない私はprefferこのコードだ:
ARMv4のため
int strcmp(const char *str1, const char *str2)
{
int s1;
int s2;
do {
s1 = *str1++;
s2 = *str2++;
if (s1 == 0)
break;
} while (s1 == s2);
return (s1 < s2) ? -1 : (s1 > s2);
}
それはとしてコンパイル:あなたはループの下でのみ6指示+最後に[最大5つの命令があります見ることができるように
strcmp:
ldrsb r3, [r0], #1 ;r3 = *r0++
ldrsb r2, [r1], #1 ;r2 = *r1++
cmp r3, #0 ;compare r3 and 0
beq @1 ;if r3 == 0 goto @1
cmp r3, r2 ;compare r3 and r2
beq strcmp ;if r3 == r2 goto strcmp
;loop is ended
@1:
cmp r3, r2 ;compare r3 and r2
blt @2 ;if r3 < r2 goto @2
movgt r0, #1 ;if r3 > r2 r0 = 1
movle r0, #0 ;if r3 <= r2 r0 = 0
bx lr ;return r0
@2:
mov r0, #-1 ;r0 = -1
bx lr ;return r0
。したがって、複雑さは6 *(strlen + 1)+ 5です。
while条件に移動すると(s1 == 0)、ARMのマシンコードが悪くなります(なぜわかりません)。
この実装についての「最適化」は何もありません。 –