Scala 中闭包的内存管理是如何工作的?

2024-02-08

Scala 允许像这样的闭包

def newCounter = {
  var a=0
  () => {a+=1;a}
}

它定义了一个函数,每次调用时都会返回一个新的独立计数器函数,从1:

scala> val counter1 = newCounter
counter1: () => Int = <function0>

scala> counter1()
res0: Int = 1

scala> counter1()
res1: Int = 2

scala> val counter2 = newCounter
counter2: () => Int = <function0>

scala> counter2()
res2: Int = 1

scala> counter1()
res3: Int = 3

像往常一样,这令人印象深刻a将代表 newCounter 堆栈帧上的内存地址。我刚刚阅读了“Programming in Scala”的闭包章节,关于此事只有以下内容(第 155 页):

Scala 编译器在这种情况下会重新排列事物,以便捕获的参数存在于堆上,而不是堆栈上,因此可以比创建它的方法调用更长寿。这个重新安排都是自动完成的,所以你不必担心。

任何人都可以详细说明它在字节码级别上是如何工作的吗?访问是否类似于具有所有相关同步和性能影响的类的成员变量?


你可以使用scalac -Xprint:lambdalift <scala-file-name>调查此事。

你的代码实际上是这样的:

def newCounter = {
  val a: runtime.IntRef = new runtime.IntRef(0);
  new Function0 {
    private[this] val a$1 = a
    def apply() = {
      a$1.elem = a$1.elem + 1
      a$1.elem
    }
  }
}

任何一个都有一个包装var由 lambda 使用。其他vars(不在闭包中使用)是常见的语言环境变量。

该包装器的链接作为字段存储在函数实例中。

lambdalift in -Xprint:lambdalift is the 编译阶段 https://stackoverflow.com/a/4528092/406435。您可以获得所有阶段-Xshow-phases。您可以使用阶段编号而不是名称,当您不确定需要哪个阶段时,它很有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 中闭包的内存管理是如何工作的? 的相关文章

  • 对 HList 进行协变过滤

    我打算以协变方式过滤 HList 我也想包含子类 所以协变滤波器Foo应捕获以下元素Foo也Bar 我已经构建了这个例子来尝试 lt lt 看看它是否做了我想做的事情 http scastie org 6465 http scastie o
  • 为什么流式数据集会失败并显示“当流式数据帧/数据集上存在流式聚合时不支持完整输出模式...”?

    我使用 Spark 2 2 0 在 Windows 上使用 Spark 结构化流时出现以下错误 有时不支持完整输出模式streaming aggregations on streaming DataFrames DataSets没有wate
  • Scala 除以零会产生不同的结果

    我对 Scala 如何处理除以零感到困惑 这是 REPL 代码片段 scala gt 1 0 java lang ArithmeticException by zero 33 elided scala gt 1 toDouble 0 toD
  • 异步 C++ 代码中的内存管理

    我一直在与boost asio一段时间以来 虽然我确实理解了异步调用的概念 但我仍然对内存管理的含义感到有些困惑 正常情况下同步代码中对象的生命周期很清楚 但考虑一个类似于以下情况的场景日间服务器 http www boost org do
  • Playframework 2.0 在视图模板中定义函数

    我正在开发一个使用 PlayFramework 2 0 的项目 在阅读了一些 scala 之后 我想在视图模板中嵌入一些动态代码 所以 我做了以下事情 def getMystring sequence Int if patternForm
  • 如何从 lift webapp 读取文件

    我想在我的 lift 应用程序中读取 xml 文件 val data XML load new java io InputStreamReader new java io FileInputStream 文件名 编码 然而 我得到java
  • Scala SBT 版本依赖性二进制兼容性错误 scala-xml

    我有一个在 GitHub 上托管的项目 我使用 scala steward 来保持我的插件和依赖项最新 这在一段时间内有效 但现在使用此类自动更新却变成了一场噩梦 事情是这样的 在我的plugins sbt中 我依赖于scoverage 它
  • 为什么 astyanax (java) 无法识别我的 scala 案例类参数列表中的 @Id 注解值?

    所以这是我的困境 我有一个域模型 其中有一堆 scala 中的案例类 例如User and Organization 在我的数据访问层 dao 存储库等 中 我使用 astyanax 来自 netflix 的 java 库 及其实体持久器将
  • 在 PHP 扩展中,推荐从 std::string 返回值的方法

    我们有一个简单的 PHP 函数 其目的是调用 C 自由函数std string callLibrary std string 并返回其std string返回值 目前看起来是这样的 PHP FUNCTION call library cha
  • Xcode Instruments:模拟器中运行的 iPhone 应用程序的峰值 RAM?

    活动监视器 又名内存监视器 是 Xcode Instruments 中唯一可以测量在模拟器中运行的 iPhone 应用程序的总应用程序 RAM 使用情况的工具吗 只是显示瞬时有线 RAM 的那条线 与 iPhone 硬件相比 尤其是 OSX
  • 我需要释放手势识别器吗?

    如果我将手势识别器添加到名为的表格单元格中cell e g UILongPressGestureRecognizer longPressRecognizer UILongPressGestureRecognizer alloc initWi
  • 如何通过 Scala REPL 使用第三方库?

    我已经下载了Algebird我想尝试一些事情Scala 解释器使用这个库 我该如何实现这一目标 当然 您可以使用 scala cp 无论如何并手动管理您的依赖项 但这变得非常乏味 尤其是当您有多个依赖项时 更灵活的方法是使用sbt http
  • 在 scala 中保留推导的更高类型

    我有一个高阶类型 并致力于用它构建一些 DSL 我正在寻找一种方法来定义可以接受类型而无需显式指定此类型的函数 自我描述示例 class Wrap T val data T class DSL def doSomething T x Wra
  • akka http配置中的idle-timeout和request timeout有什么区别?

    我查阅了文档并发现了这些 空闲连接自动关闭的时间 设置infinite完全禁用空闲连接超时 空闲超时 10 秒 Defines the default time period within which the application has
  • Scala 中的 Apply 和 lambda

    我有下面的代码 scala gt val builder new StringBuilder foo bar baz builder StringBuilder foo bar baz scala gt 0 until 5 foreach
  • Scala 模式匹配打印漂亮

    是否有可能以某种方式编组部分函数 假设它总是只包含一种情况 进入某物人类可读的 假设我们有 Any 类型的集合 消息 List Any 以及使用模式匹配块定义的 PartialFuntion Any T 的数量 case object R1
  • 删除数组时出现访问冲突异常

    删除分配的内存时 出现 访问冲突读取位置 异常 如下所示 我有一个针对 Visual Studio 2010 工具集 v100 C 编译器编译的本机 dll 我有一个针对它的托管 dll 包装器 它是针对工具集 v90 编译的 因为我想以
  • Swift try inside Objective-C 块

    我需要创建一个函数foo它接受一个抛出闭包作为参数 我可以使用 Swift 或 ObjC 来实现它 但我需要能够从两者中调用它 像这样 Swift func bar throws func foo block throws gt void
  • Scala REPL / SBT Console 是否有配置文件?

    我一直在尝试找到某种点文件来放入 Scala REPL 设置和自定义函数 我特别有兴趣传递它的标志 例如 Dscala color 启用语法突出显示 以及覆盖设置 如结果字符串截断 scala gt power scala gt vals
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象

随机推荐

  • 具有 MySQL 故障转移功能的 Hibernate Web 应用程序

    我开发了一个 Java Web 应用程序 使用 Hibernate 3 3 2 作为持久性框架 使用 Apache Tomcat 7 0 27 作为服务器 该应用程序已成功设置为使用 MySQL 5 5 复制服务器 1 个主服务器 1 个从
  • 如何将 vtkSphere 保存到 VTK 文件?

    我正在尝试将多个球体保存到一个文件中 以便稍后使用 ParaView 进行可视化 我拥有的是一个文本文件 其中包含有关每个球体的位置和形状 半径 的信息 我正在使用 Python 和 VTK 构建一个文件来可视化 ParaView 中的数据
  • 使用 OR 工具在 python 中进行约束优化:如何强制执行多级约束?

    我有一个优化问题 我有一个 BoolVar 对象列表的列表 所以像这样 BoolVar1 BoolVar2 BoolVar3 BoolVar4 BoolVar5 BoolVar6 我需要评估以下内容 BoolVar1 BoolVar2 Bo
  • 关于 C# 的 AOP 的建议 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 MySQL DB 完成 Java 桌面应用程序后如何创建安装程序?

    我已经用 mySQL 数据库编写了一个 Java 桌面应用程序 我想让应用程序在netbeans之外运行并让它安装在其他计算机上 我知道如何构建项目并创建可运行的 jar 文件 但这需要我将数据库本身导出到我希望应用程序运行的另一台计算机
  • apache 全局基本身份验证

    我有 apache Web 服务器和几个虚拟主机 我希望它们都支持基本授权 AuthType Basic 但是 Auth 指令似乎仅适用于
  • NSURLSession 使用 get 发送参数

    我正在尝试解析来自 php 的信息 但我需要发送一个字典参数 所以我尝试了一些事情 我看到了教程 示例 但我陷入困境 所以我回到了开始 这是什么好方法这样做吗 func asd let urlPath http xxxxx php let
  • 为什么 Spyder 在 OS X 中这么慢?有没有办法让它更快?

    我安装了 Spyder 作为 Anaconda Python 分析包的一部分 但我发现编辑器非常慢 按键和屏幕上显示字母之间总是有半秒的延迟时间 我在一台相当新的 i7 MacBook 上使用 Spyder 这个问题是由 Qt 产生的 Qt
  • 监听/通知 pgconnection 宕机了 java?

    我正在使用 PostgreSQL DB 并应用它LISTEN NOTIFY功能 所以我的监听器位于我的 AS 应用程序服务器 上 并且我在数据库上配置了触发器 这样当对表执行 CRUD 操作时NOTIFY请求在 AS 上发送 LISTENE
  • python 类继承树

    假设我有这样的课程 class a object pass class b a pass class c b pass class d c pass class e b pass 我想要一个可以执行以下操作的函数 gt gt gt get
  • 哈希表和子串匹配

    我有数百个键 例如 红苹果 maninred foraman 蓝苹果 我有与这些键相关的数据 数据是一个字符串 末尾有相关的键 红苹果 树上有红苹果 maninred 她看到了maninred 孔洞 他们买了现在的孔洞 蓝苹果 令人惊讶 但
  • 在 C++ 中创建全局“常量”的正确方法[重复]

    这个问题在这里已经有答案了 通常 我定义真正的全局常量 比如说 pi 的方法是将 extern const 放置在头文件中 并在 cpp 文件中定义该常量 常量 h extern const pi 常量 cpp include consta
  • T-SQL。如何在一个 SELECT 中创建列表作为逗号分隔的字符串?

    MS SQL 2005 T SQL 我发现了很多如何分割字符串的好解决方案 但是如何将内部 SELECT 的结果组合为字符串 例如 使用逗号分隔符 代码 SELECT b date SELECT o number FROM order o
  • 为什么 flutter 停止在 ios 上启动我的应用程序

    突然之间 我无法运行使用 firebase 的 flutter 应用程序 显然 pod 安装过程存在问题 某些依赖项不兼容 鉴于我没有更改 yaml 文件中的任何内容 并且应用程序今天早上运行良好 我认为工具存在问题 而不是我的源代码 这个
  • XAML WPF 中 {x:Static} 和 {StaticResource} 之间的区别

    有什么区别 x Static and StaticResource 在 WPF 的 XAML 代码中 例如
  • MySql 对视图列的注释?

    MySql 是否可以存储视图列的注释 我知道如何向普通表和列添加注释 但我不确定是否可以对视图这样做 我所知道的是视图 对于某些方面 的行为就像表一样 因此可以像这样运行查询 SELECT column name column commen
  • 捕获 Global.asax 中的错误

    我的中有以下内容Global asax这是为了处理错误 void Application Error object sender EventArgs e Exception exception Server GetLastError if
  • Android:重叠两个视图(故意的!)

    只是想知道是否可以重叠两个元素 这是我试图实现的目标的说明 基本上它是一个圆形的 ImageButton 其中心位于矩形的角上 我应该如何定位它 我可以使用RelativeLayout或其他东西吗 您可以对蓝色框使用相对布局 将 Image
  • Decimal.TryParse 不解析我的十进制值

    当我尝试转换类似 0 1 的值 来自文本框中的用户 时 我的值 b 始终为 false bool b Decimal TryParse 0 1 out value 怎么会来这里工作呢 指定解析的区域性 您当前的文化可能使用某种不同的数字格式
  • Scala 中闭包的内存管理是如何工作的?

    Scala 允许像这样的闭包 def newCounter var a 0 gt a 1 a 它定义了一个函数 每次调用时都会返回一个新的独立计数器函数 从1 scala gt val counter1 newCounter counter