VC++6 Pro付属のcl Version 12.00.8168で /O2 指定でコンパイルしたところまったく違うコードをはきます。が、配列版を元にしたほうが高速になります。またポインタ版のコード量が大幅に膨れます。 *配列版 ; Line 7 mov edx, DWORD PTR _t$[esp-4] mov eax, DWORD PTR _s$[esp-4] mov cl, BYTE PTR [edx] test cl, cl mov BYTE PTR [eax], cl je SHORT $L96 sub edx, eax $L95: mov cl, BYTE PTR [edx+eax+1] ; Line 8 inc eax test cl, cl mov BYTE PTR [eax], cl jne SHORT $L95 $L96: ; Line 9 ret 0
*ポインタ版 ; Line 14 mov edx, DWORD PTR _t$[esp-4] mov ecx, DWORD PTR _s$[esp-4] inc ecx mov al, BYTE PTR [edx] inc edx mov BYTE PTR [ecx-1], al test al, al je SHORT $L105 $L104: mov al, BYTE PTR [edx] mov BYTE PTR [ecx], al inc ecx inc edx test al, al jne SHORT $L104 $L105: ; Line 16 ret 0
本当に読んでからそういいます。 (スコア:1)
mov eax,dword ptr [ebp+8]
mov edx,eax
のような無駄な部分があります。後一歩といったところです。
VC++6 Pro付属のcl Version 12.00.8168で /O2 指定でコンパイルしたところまったく違うコードをはきます。が、配列版を元にしたほうが高速になります。またポインタ版のコード量が大幅に膨れます。
*配列版
; Line 7
mov edx, DWORD PTR _t$[esp-4]
mov eax, DWORD PTR _s$[esp-4]
mov cl, BYTE PTR [edx]
test cl, cl
mov BYTE PTR [eax], cl
je SHORT $L96
sub edx, eax
$L95:
mov cl, BYTE PTR [edx+eax+1]
; Line 8
inc eax
test cl, cl
mov BYTE PTR [eax], cl
jne SHORT $L95
$L96:
; Line 9
ret 0
*ポインタ版
; Line 14
mov edx, DWORD PTR _t$[esp-4]
mov ecx, DWORD PTR _s$[esp-4]
inc ecx
mov al, BYTE PTR [edx]
inc edx
mov BYTE PTR [ecx-1], al
test al, al
je SHORT $L105
$L104:
mov al, BYTE PTR [edx]
mov BYTE PTR [ecx], al
inc ecx
inc edx
test al, al
jne SHORT $L104
$L105:
; Line 16
ret 0
配列版のほうがincが一つ減っていることが分かると思います。
Re:本当に読んでからそういいます。 (スコア:1)
実験ありがとうございます。 手元に VC6 がないのでこういう情報は大変ありがたいです。
# VC++.NET の Express Edition なら頑張って動かせなくはないのですが... (^^;
何時の間にやら件の記事の内容も部分的に変更されているようで
となっていました (これなら全く異存ありません)。