Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript v8如何存储快速对象_Javascript_V8 - Fatal编程技术网

Javascript v8如何存储快速对象

Javascript v8如何存储快速对象,javascript,v8,Javascript,V8,作为对答案的后续问题,我想知道v8实际上是如何存储“快速”对象的 答案如下: 快速模式对于属性访问通常要快得多,但需要知道对象的结构 V8最初将尝试构造一个对象外观的模板,称为“隐藏类”。对象将通过隐藏类进行转换,直到V8放弃并将对象存储为慢速属性 然后我问v8是否会在对象增长时重新灰化,答案是: 根本没有散列——它只是内存访问的一个偏移量——就像C中的结构一样 (用于快速模式对象) 它还提到: 在这种情况下,对象根本不存储为哈希映射-它是一个隐藏类 总之,即使您更改了对象属性,它仍然是结构化的

作为对答案的后续问题,我想知道v8实际上是如何存储“快速”对象的

答案如下:

快速模式对于属性访问通常要快得多,但需要知道对象的结构

V8最初将尝试构造一个对象外观的模板,称为“隐藏类”。对象将通过隐藏类进行转换,直到V8放弃并将对象存储为慢速属性

然后我问v8是否会在对象增长时重新灰化,答案是:

根本没有散列——它只是内存访问的一个偏移量——就像C中的结构一样

(用于快速模式对象)

它还提到:

在这种情况下,对象根本不存储为哈希映射-它是一个隐藏类

总之,即使您更改了对象属性,它仍然是结构化的,因此存在一个隐藏类:

var x = { a: 1, b: 2, c: 3 }
x.d = 4
x.e = 5
x.f = 6

根据答案,v8实际上并没有使用哈希表来存储值,因为它使用了一个隐藏类。所以问题是,v8实际上如何将值存储为隐藏的类结构。隐藏类做什么,它是如何构造的,它是如何工作的。当您稍后在代码中执行
vard='d';x[d]
(只是为了使其动态化),它如何知道
d
的值在哪里,而不将
d
属性散列为字符串以获取索引(理论上)。它如何从键中找到结构的内存地址。

每次修改对象的结构时,都会创建新的隐藏类。假设我们有常数obj={val:1};然后将创建隐藏类。如果执行obj.val=2,则不会发生任何更改。但如果执行obj.newProp=“”,则将创建新的隐藏类。这就是为什么让对象更不稳定以减少隐藏类的数量并帮助V8处理它们很重要的原因。@Vitalii我理解这一部分:)但我不理解如何实际实现找到键控值的内存地址。你的意思是:如何访问隐藏类,使平面对象没有任何映射和散列?不,我的意思是当你做
vard='d';x[d]
,发动机罩下发生的事情。C代码如何解释该代码。也就是说,它是如何找到价值的。答案是隐藏的类是一个结构,所以你可以直接跳转到内存中的那个地方。但是它是如何从
vard='d';x[d]
到结构在内存中的位置。查看并