V8 如何存储像 5 这样的整数?

Спа*_*лов 4 javascript memory memory-management v8

V8如何在内存中存储整数?

例如整数5?

我知道它存储在堆中,但是它到底是如何存储的呢?诸如元数据和实际值本身之类的东西。int 存储之前是否添加了常量?

Sup*_*fly 11

V8 使用指针标记方案来区分小整数和堆对象指针。5 将存储为Smi类型,在 V8 中未分配堆。

您可以查看Smi 类的源代码以了解更多信息。

在 32 位平台上,Smis 是一个 31 位有符号 int,底部位设置为 0。在 64 位平台上,Smis 是一个 32 位有符号整型,31 位 0 填充,底部位 0。指向堆对象的指针的底部位设置为 1,这样 V8 就可以区分指针和 Smis 之间的区别,而无需额外的元数据。

  • 由于[指针压缩](https://v8.dev/blog/pointer-compression),当代版本的 V8 即使在 64 位平台上也将 SMI 存储为 31 位整数。这允许将指针存储为 4 个字节并显着减少内存消耗。 (3认同)