【问题标题】:Are generator function's local variable stored on Stack or Heap?生成器函数的局部变量是存储在堆栈还是堆上?
【发布时间】:2019-09-08 00:00:36
【问题描述】:

在这篇文章中: https://wingolog.org/archives/2013/06/11/ecmascript-generators-from-a-performance-perspective,它提到:

在生成器函数中,V8 将局部变量存储在堆上 而不是在堆栈上。

但它也与下一段自相矛盾:

这种情况的例外是当你让道并且有 堆栈上的临时对象。回想一下我关于 V8 基线的文章 编译器认为完整的代码生成是一个堆栈机器。它分配插槽 到命名的本地,但临时值在运行时进入堆栈,

我不明白的部分是生成器函数总是使用yield,我认为文章中提到的suspension是指yield语句。

【问题讨论】:

  • 什么文章?你没有链接到它。
  • 另外,在一个案例中提及例外又是如何矛盾的?
  • @ScottMarcus 谢谢!
  • 您引用的第二段不是在谈论生成器,而是在描述 V8 基线编译器的一般工作方式。
  • 它描述了两个引号之间的两段中描述的内容的异常。

标签: javascript optimization heap-memory generator v8


【解决方案1】:

我认为这篇文章缺少一个例子:

  return 12 + yield 5

在这种情况下,必须在堆栈上分配 12,并且在暂停迭代器时,必须将其从堆栈中复制出来,然后在迭代器继续时再次将其复制到堆栈中。第二段谈论的是“临时变量”(在这种情况下是 12 个),而不是“变量”。

【讨论】:

  • 所以临时 12 将在堆栈中,如果我们声明 var x = 5,x 将存储在堆中?
  • 是的,我就是这么理解的。
猜你喜欢
  • 2017-11-05
  • 2021-10-13
  • 2013-01-10
  • 2013-03-07
  • 2021-06-19
  • 1970-01-01
  • 2014-04-21
  • 2015-05-03
相关资源
最近更新 更多