3

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

我的观点如下:由于该函数没有任何可见的副作用,因此在途中分配的所有内存都可以在函数退出时确定性地释放。因此,实际上并不需要 GC,因为可以避免标记和扫描步骤。还是不能?

4

2 回答 2

5

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

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

于 2015-12-22T23:44:45.617 回答
2

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

... 意味着该函数不会在 GC 堆上分配内存,无论是直接使用 NewExpression 还是间接通过它可能调用的函数,或者通过数组连接和动态闭包等语言特性。

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

另一个重要的一点是它@nogc不会受到优化的影响,因为相同的有效代码必须使用不同的优化级别和不同的编译器继续编译。任何此类优化都需要在语言规范中成为强制性的,然后@nogc才能使用它。

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

  1. 它实际上根本没有进行任何 GC 调用,它被完全优化了
  2. 这种优化是强制性的,并且保证在这种情况下对于所有符合语言规范的编译器总是发生

我认为这是极不可能的。

于 2015-12-23T12:23:46.153 回答