3

TypedArray规范声明 ArrayBufferView 可以这样创建:

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

但是,第二个参数byteOffset有一个限制:

给定的 byteOffset 必须是特定类型的元素大小的倍数,否则会引发异常。

这意味着我们不能使用两字节视图的奇数偏移,例如:

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 回答