ArrayBufferView构造函数中的奇怪限制

时间:2011-09-26 11:37:00

标签: javascript arraybuffer

TypedArray specification表示可以用这种方式创建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的灵活性。

有人知道为什么会施加此限制吗?

1 个答案:

答案 0 :(得分:3)

为了保持类型化数组视图(如Uint16Array和Float32Array)的最大性能,强制实施此限制。这些类型设计用于对机器自然对齐的数据进行操作。支持未对齐的负载会使速度快的情况变得无法接受,或导致性能“悬崖”,程序大多数会快速运行,除非它们的速度减慢很大。

DataView旨在支持单个数据元素的未对齐加载和存储,专门用于处理网络或磁盘I / O的情况,其中文件格式可能没有任何对齐限制。