3

TypedArray 仕様では、ArrayBufferView は次の方法で作成できると規定されています。

TypedArray(ArrayBuffer buffer, 
           optional unsigned long byteOffset, optional unsigned long length)

ただし、2 番目のパラメーター にbyteOffsetは制限があります。

指定された byteOffset は、特定の型の要素サイズの倍数である必要があります。そうでない場合、例外が発生します。

これは、次のような 2 バイト ビューの奇数オフセットを扱うことができないことを意味します。

var view1  = new Uint8Array([0, 1, 2, 3]),
    view2 = new Uint16Array(view1.buffer, 1, 1);

したがって、[1,2] を Uint16 に正しく変換できたとしても、その方法でそれらの要素にアクセスすることはできません。byteOffset の制限により、ArrayBufferViewの柔軟性が大幅に低下するようです。

この制限が課された理由を知っている人はいますか?

4

1 に答える 1

3

この制限は、Uint16Array や Float32Array などの型付き配列ビューの最大パフォーマンスを維持するために課されました。これらの型は、マシンの自然な位置合わせでデータを操作するように設計されています。アラインされていないロードをサポートすると、高速なケースが容認できないほど遅くなるか、プログラムが大幅に遅くなる場合を除いて、プログラムがほとんど高速に実行されるパフォーマンスの「崖」につながります。

DataView は、データの単一要素のアラインされていないロードとストアをサポートするように設計されています。特に、ファイル形式にアラインメントの制限がないネットワークやディスク I/O のケースを処理するために設計されています。

于 2011-09-27T16:02:39.493 に答える