JavaScript:V8 问题:小整数是池化的吗?

标签 javascript v8

正在看这个V8 design doc其中有一个 Constant Pool Entries 的部分
它说

Constant pools are used to store heap objects and small integers that are referenced as constants in generated bytecode. and


... Small integers and the strong referenced oddball type’s have bytecodes to load them directly and do not go into the constant pool.


所以我很困惑:小整数是否合并?
我的理解是,如果 sizeof(int) < sizeof(int *) 合并小整数是不值得的。 - 因为只复制实际整数而不是复制指向常量池中整数的指针更便宜。保存整数的变量也可以优化为直接存储在 CPU 寄存器中,并跳过首先在内存中分配。
另外,它们是位于 V8 堆还是堆栈上?我的理解一直是 smis 只是在堆栈上分配的立即值,而不是在堆上分配的指针 + 整数。此外,如果您使用 chrome devtool 拍摄堆快照,您将无法在堆快照中找到 smis - 在我看到这篇文章 https://v8.dev/blog/pointer-compression#value-tagging-in-v8 之前,堆上只有诸如大整数之类的堆号或 3.14 之类的 double 数。

JavaScript values in V8 are represented as objects and allocated on the V8 heap, no matter if they are objects, arrays, numbers or strings. This allows us to represent any value as a pointer to an object.


现在我很困惑 - smis 也分配在堆上吗?

最佳答案

V8 开发人员在这里。

are small integers pooled or not?


他们不是(至少现在不是)。也就是说,这是一个小的实现细节,可以通过任何一种方式完成:完全可以将常量池用于 Smis。我想为 Smis 构建特殊机制(而不是重用通用常量池)的决定是因为事实证明这样更有效。

it is not worth it pooling small integers if sizeof(int) < sizeof(int *)


细节有所不同(Smi 不是 int,常量池槽由索引而不是 C++ 指针引用),但这种推理确实朝着正确的方向发展:避免间接可以节省时间和内存。

are smis also allocated on the heap?


是的,一切都在堆上分配。堆栈只对临时(并且足够小)的东西有用;这在很大程度上与事物的类型无关。
Smis 的“诀窍”是它们不存储为单独的对象:当您有一个引用 Smi 的对象时,例如 let foo = {smi: 42} , 那么值 42可以进行 smi 编码并直接存储在“foo”对象中(而如果值为 42.5,则该对象将存储指向单独的“HeapNumber”的指针)。但是由于对象在堆上,所以 Smi 也是。
@丹尼尔克鲁兹

What I understand [...] is that constant small integers are pooled. Variable small integers are not.


没有。源代码中出现的任何文字都是“常量”。无论您使用letconst因为您的变量与此无关。

关于JavaScript:V8 问题:小整数是池化的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70734678/

相关文章:

javascript - (OnsenUi) 使用 Animate.css 和 AngularJS 时出现的问题

android - V8 独立应用程序仅在发布签名的 APK 时死于 SIGILL

Node.js 源代码构建在 ARM 上给出段错误

javascript - 与 C 中的相同值相比,为什么 Javascript 的 Math.pow() 似乎返回一个舍入值?

javascript - 使用 jquery 平滑滚动到另一个页面上的 ID Div

javascript - 放置事件未在 JS 中触发/触发

javascript - 想要同时匹配大写和小写字母

javascript - react : timeout call to Firebase

JavaScript 引擎性能基准测试

c++ - 从 v8::Arguments 转换为 C++ 类型