【问题标题】:In V8, how are primitive types such as null, undefined, and boolean stored in memory?在 V8 中,null、undefined 和 boolean 等原始类型如何存储在内存中?
【发布时间】:2015-09-23 07:17:26
【问题描述】:

boolean 是否以 32 位整数形式存储在内存中? null 值怎么样?

在书中Speaking Javascript, 它指的是一个类型标记,用于指示存储在内存中的值的类型。例如Object 类型的类型标签是 000。什么是类型标签?

如何找到 booleanstring 等值类型的 type 标签

【问题讨论】:

  • @RichS 你可能是对的。您可以点击帖子下方的编辑按钮来建议编辑。 =)
  • 不管怎样,今天和未来的问题的答案将是特定于实现的,在这种情况下,人们会希望谷歌搜索“v8”或类似的而不是“javascript”。建议参考:v8 primitive types

标签: javascript v8 javascript-engine


【解决方案1】:

来自 Andy Wingo 的 blog post 主题:

最初,所有 JavaScript 实现都使用标记指针来表示 JS 值。这是一个古老的技巧,源于观察到分配的内存至少占用 4 或 8 个字节,并以最低有效位或 3 位为零的方式对齐。

因此类型标签允许统一存储所有值。所有值都占用一个机器字(32/64 位),并且根据标签(这是最低有效位或位),它们被解释为指向对象的指针或某些整数/布尔值/等,具体取决于标签。

布尔值是否以 32 字节整数形式存储在 js 内存中?

一个布尔值也占一个词。要获得更具体的答案,我需要查看 v8 源代码。但如果我没记错的话,truefalse 表示为根指针。

如何获取值类型的类型标签(boolean,undefined,string, number);

无法从 JavaScript 中做到这一点。这是内部实现细节。

【讨论】:

  • oh.good.thanks.but 一些问题:root pointers 是什么,另外,你能从 v8 源码中找到`tag type` 的详细信息吗?
  • @SKing7,抱歉耽搁了。 Root objectsroot pointers 是一个垃圾回收术语,表示对象按定义存活(v8 的 GC 遍历从根开始的指针以定义哪些是存活的,其余的得到GC'd)。见jayconrod.com/posts/55/a-tour-of-v8-garbage-collection。关于你的第二个问题,你为什么需要标签(好吧,如果你仍然这样做:-))?是的,当然有关标签的信息可以在 v8 源代码中找到。
猜你喜欢
  • 2014-01-16
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
相关资源
最近更新 更多