V8引擎JS中同隐藏类PACKED_ELEMENTS对象数组的内存连续性问询
V8引擎中同隐藏类对象数组的内存布局问题
先看示例代码:
const array = []; for(let i = 0; i<20000; i++) array.push({x:1.2, y:3.4, t:123+i});
该数组的每个元素都属于同一隐藏类,对应属性类型为 [double, double, small integer]。
我有以下核心疑问:
- 这些元素的内容在内存中是否连续?是否会呈现为这种连续存储形式:
[double, double, small integer, double, double, small integer, double, double, small integer...] - 实际内存布局到底是哪种:是直接在数组内连续存储元素的所有属性值,还是数组仅存储对象指针,而对象本身在堆上至少被分配在邻近区域(类似如下形式):
[指针, double, double, small integer, 指针, double, double, small integer, 指针, ...]
已知PACKED_DOUBLE_ELEMENTS类型的双精度数组采用连续存储元素的布局,但对象数组的行为我一直没搞清楚。相关术语搜索难度大,已经看了约4小时技术视频仍未找到明确答案。
这个问题直接关系到性能与数据局部性优化,虽然我可以把“数组-of-结构体”的形式拆分为“结构体-of-数组”,并使用SMI或双精度类型来获得更好的内存连续性,但为了代码易用性,我希望能避免这种拆分操作。
内容的提问来源于stack exchange,提问作者2bam
相关产品推荐
相关产品推荐

