没有传递内存的纯粹和非运行功能是否会自动收集垃圾?

时间:2015-12-22 23:38:32

标签: garbage-collection d purely-functional

假设您在D中有一个purenothrow的函数,并且其返回类型和参数类型不能传递任何新分配的内存。我可以将@nogc属性添加到此功能吗?如果没有,将来是否有可能实现这一目标?

我的观点如下:由于该函数没有任何可见的副作用,因此在函数出口处可以确定地释放在路上分配的所有内存。因此,实际上不需要GC,因为可以避免标记和扫描步骤。或者不是吗?

2 个答案:

答案 0 :(得分:5)

您可以随时尝试添加@nogc并进行编译。纯函数仍然可以分配内部缓冲区,即使它没有返回任何内部缓冲区,因此垃圾收集的问题与纯度不同。

如果它通过@nogc进行编译,它将不会分配(因此不会收集,D GC只会在您要求分配时收集),无论其纯度如何。

答案 1 :(得分:2)

https://dlang.org/spec/attribute.html#nogc

  

...表示该函数不在GC堆上分配内存,   或者直接使用NewExpression或间接通过   它可以调用的函数,或者通过数组等语言功能   连接和动态闭包。

在函数执行或整体内存使用量增加后,它不会告诉任何有关GC状态的信息。唯一重要的是保证函数本身永远不会调用任何GC分配函数,即您可以使用根本没有链接GC实现的自定义运行时可靠地构建和运行此类函数。

另一个要点是@nogc不能受优化的影响,因为相同的有效代码必须使用不同的优化级别和不同的编译器进行编译。在@nogc可以使用之前,任何此类优化都需要在语言规范中成为必需的。

考虑到所有这些,只有满足以下两个条件时,您描述的函数才能获得有效的@nogc注释:

  1. 它根本不会进行任何GC调用,它已完全优化
  2. 此类优化是强制性的,并且在所有符合标准的编译器的语境规范
  3. 的情况下,始终保证这种优化

    我觉得这不太可能。