首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript: V8问题:小整数集合了吗?

JavaScript: V8问题:小整数集合了吗?
EN

Stack Overflow用户
提问于 2022-01-16 22:23:18
回答 1查看 196关注 0票数 6

正在查看这个V8设计文档,其中有一个Constant Pool Entries

上面写着

常量池用于存储堆对象和在生成的字节码中作为常量引用的小整数。还有..。小整数和强引用的oddball类型有字节码直接加载它们,并执行而不是进入常量池。

所以我很困惑:小整数是否汇集在一起?

我的理解是,如果是sizeof(int) < sizeof(int *),它不值得它池中的小整数,因为只复制实际的整数而不是复制指向常量池中的整数的指针更便宜。此外,可以优化保存整数的变量,使其直接存储在CPU寄存器中,并跳过首先在内存中分配。

而且,它们是位于V8堆还是堆栈上?我的理解一直是,smis只是在堆栈上分配的即时值,而不是指针+堆上分配的整数。另外,如果使用chrome获取堆快照,则无法在堆快照中找到smis -在本文https://v8.dev/blog/pointer-compression#value-tagging-in-v8之前,堆上只有堆号,如大整数或双倍堆数3.14。

JavaScript值在V8中表示为对象,并在V8堆上分配,无论它们是对象、数组、数字还是字符串。这允许我们将任何值表示为指向对象的指针。

现在我感到困惑--堆中是否也分配了smis?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-17 12:37:26

这里是V8开发人员。

小整数集合还是不集合?

他们不是(至少现在不是)。尽管如此,这是一个很小的实现细节,可以通过任何一种方式完成: Smis完全可以使用常量池。我想,之所以决定为Smis建立特殊的机器(而不是重用通用的常量池),是因为这样做的效率更高。

如果sizeof(int) < sizeof(int *),则不值得它汇集小整数。

细节是不同的( Smi不是int,常量池槽是由索引而不是C++指针引用的),但是这个推理是正确的:避免间接可以节省时间和内存。

堆上是否也分配了smis?

是的,所有东西都是在堆上分配的。堆栈只对临时的(和足够小的)事物有用;这在很大程度上与事物的类型无关。

Smi的“诀窍”是,它们不作为单独的对象存储:当您有一个引用smi的对象(如let foo = {smi: 42} )时,值42可以被smi编码并直接存储在"foo“对象中(而如果值是42.5,则该对象将存储指向单独的”HeapNumber“的指针)。但是,由于对象在堆上,所以Smi也是如此。

@DanielCruz

我所理解的..。就是常量小整数被集合起来。变量小整数不是。

不是的。在源代码中出现的任何文字都是“常量”。无论您对变量使用let还是const,都与此无关。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70734678

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档