ArrayBufferView构造函数中存在奇怪的限制

4

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的灵活性。
有人知道为什么要实施这种限制吗?
1个回答

3

这个限制是为了保持类似Uint16Array和Float32Array这样的类型最大性能而实施的。这些类型被设计为在机器的自然对齐的数据上操作。支持未对齐的加载将要么不可接受地减慢快速情况,要么导致性能“悬崖”,即程序大多数时间都能快速运行,但会因为一个很大的因素而变慢。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接