- 503 名前:デフォルトの名無しさん mailto:sage [2021/11/28(日) 21:40:43.94 ID:tN4i8A7m.net]
- Cの場合のリンクリストのポインタを介してのアクセスは、
mov ebx,ptr mov eax,[ebx] ので済む。配列の場合は、 mov ebx,index ;添え字番号 mov eax,[ebp+ebx+32] ;32はスタックの中での位置 だから、配列とポインタで速度が変わらない。むしろこの例だとリンクリスト の方が僅かに速いくらい。 Rustの場合、借用規則で禁止されてしまうため、以下のようになってしまう。 このスレである人が実装を示した独自Cursorをrustcでマシン語に直したものを アセンブリ言語で書いた場合、次のように成る: mov ebx,pseudo_ptr ;Cursorの中味はポインタの変わりに配列の番号になってしまう。 cmp ebx,配列要素数 ;safeモードの配列の境界チェック(これと次の命令はオプションで外せるかも) jae 境界チェックエラーのラベル ;条件ジャンプ命令は遅くなる原因になりやすい。 imul ebx,要素のバイト数 ;13〜35クロック位。CPUによってこの限りではない。 add ebx,配列の先頭アドレス ;Cursorの実装の内部で用いられていた配列の先頭アドレス mov eax,[ebx] ;間接アドレッシングによって実際にアドレスebxにアクセスする。 これは、O(1)ではあるが、20〜50クロック位かかり、先に示したCの場合とは 雲泥の差である。
|

|