ArrayBufferView 构造函数中的奇怪限制[重复]

2023-12-03

The 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的灵活性。

有谁知道为什么施加这个限制?


施加此限制是为了保持类型化数组视图(例如 Uint16Array 和 Float32Array)的最佳性能。这些类型旨在对机器自然对齐的数据进行操作。支持未对齐的负载要么会导致快速情况的速度降低到令人无法接受的程度,要么会导致性能“悬崖”,程序在大多数情况下都会运行得很快,除非它们减慢了很大的因素。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ArrayBufferView 构造函数中的奇怪限制[重复] 的相关文章

随机推荐