当前位置:  开发笔记 > 编程语言 > 正文

F#:哪个内存区域是存储的延续:堆栈还是堆?

如何解决《F#:哪个内存区域是存储的延续:堆栈还是堆?》经验,为你挑选了1个好方法。

简短的回答是,continuation由堆分配的对象表示.当您执行使用延续传递样式编写的代码时,表示延续的对象树(在堆上)会增长.

但是,continuation不存储要运行的代码 - 它只存储闭包(代码使用的变量和其他状态).由continuation树中的每个节点执行的代码始终是相同的(并且它以与普通.NET方法相同的方式存储).

假设我们有一些非常简单的东西:

let rec factorial n c =
  if n = 0 then c 1
  else factorial (n - 1) (fun r -> c (r * n))

在3个递归步骤之后factorial 3 id,该c值将是堆分配的对象,如下所示:

      +--------+   +--------+   +--------+
      | n = 1  | / | n = 2  | / | n = 3  |
      | c = ----/  | c = ----/  | c = id |
      +--------+   +--------+   +--------+   

因此,如果我的ASCII艺术有意义,我们有3个已分配的对象,这些对象包含继续运行函数体所需的值.也就是说,前一个c值和n当前迭代的值.



1> Tomas Petric..:

简短的回答是,continuation由堆分配的对象表示.当您执行使用延续传递样式编写的代码时,表示延续的对象树(在堆上)会增长.

但是,continuation不存储要运行的代码 - 它只存储闭包(代码使用的变量和其他状态).由continuation树中的每个节点执行的代码始终是相同的(并且它以与普通.NET方法相同的方式存储).

假设我们有一些非常简单的东西:

let rec factorial n c =
  if n = 0 then c 1
  else factorial (n - 1) (fun r -> c (r * n))

在3个递归步骤之后factorial 3 id,该c值将是堆分配的对象,如下所示:

      +--------+   +--------+   +--------+
      | n = 1  | / | n = 2  | / | n = 3  |
      | c = ----/  | c = ----/  | c = id |
      +--------+   +--------+   +--------+   

因此,如果我的ASCII艺术有意义,我们有3个已分配的对象,这些对象包含继续运行函数体所需的值.也就是说,前一个c值和n当前迭代的值.


我认为应该添加它,为了更加清晰,在一些自动生成的常规.NET类中生成`fun r - > c(r*n)`的实际代码作为常规.NET方法生成,并且不会重新生成 - 每次通话都会产生.
推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有