Pointers 为什么V8使用指针标记而不是NaN装箱?

Pointers 为什么V8使用指针标记而不是NaN装箱?,pointers,optimization,v8,javascript-engine,nan-boxing,Pointers,Optimization,V8,Javascript Engine,Nan Boxing,我现在正在学习。我了解到V8用于存储值,但想知道为什么不使用它 好吧,NaN拳击更好,因为它还可以储存双打,而不仅仅是SMI。我已经阅读并理解(如果这是真的)为什么不在32位平台上使用NaN装箱。但在64位平台上,我不明白为什么 我怀疑原因与SMIs有关。也许它们不能用NaN boxing存储?我想他们可以。我们有52个多余的位(我们甚至可以使用超过32位)。也许这将需要额外的屏蔽操作,这将使整数数学变得更慢?但是我们已经需要按位移位了 我不知道为什么。感谢所有愿意回答的人。(这里是V8开发者。

我现在正在学习。我了解到V8用于存储值,但想知道为什么不使用它

好吧,NaN拳击更好,因为它还可以储存双打,而不仅仅是SMI。我已经阅读并理解(如果这是真的)为什么不在32位平台上使用NaN装箱。但在64位平台上,我不明白为什么

我怀疑原因与SMIs有关。也许它们不能用NaN boxing存储?我想他们可以。我们有52个多余的位(我们甚至可以使用超过32位)。也许这将需要额外的屏蔽操作,这将使整数数学变得更慢?但是我们已经需要按位移位了

我不知道为什么。感谢所有愿意回答的人。

(这里是V8开发者。)NaN-boxing和指针标记是具有不同权衡的设计选择,两者都不比另一个好。V8使用指针标记的决定早在我加入该项目之前就已经做出,因此我只能推测当时的具体原因

指针标记的优点是:

  • 显著减少内存消耗(当然是在32位平台上;在64位平台上也有“”)
  • 稍微更高效(小)的整数运算,因为大多数CPU的整数运算比双精度运算快。一旦优化编译器进入画面,这可能根本不重要
  • 更高效的指针操作,因为您可以在访问对象字段时简单地添加一个调整后的偏移量(其性能与根本不玩任何指针把戏相同),而不必屏蔽NaN的不相关部分。一旦优化编译器进入画面,这可能根本不重要

正如您所指出的,NaN标记的主要好处是它支持完整的双范围,这在某些情况下非常好。您可以基于这两种技术构建性能良好的引擎。

谢谢。关于第二点,我在我的问题中提到了它(有点含蓄),当我说你有52位时,我的意思是说你可以在其中存储SMI。但是,仍然需要位屏蔽