假设您在D中有一个pure
和nothrow
的函数,并且其返回类型和参数类型不能传递任何新分配的内存。我可以将@nogc
属性添加到此功能吗?如果没有,将来是否有可能实现这一目标?
我的观点如下:由于该函数没有任何可见的副作用,因此在函数出口处可以确定地释放在路上分配的所有内存。因此,实际上不需要GC,因为可以避免标记和扫描步骤。或者不是吗?
答案 0 :(得分:5)
您可以随时尝试添加@nogc
并进行编译。纯函数仍然可以分配内部缓冲区,即使它没有返回任何内部缓冲区,因此垃圾收集的问题与纯度不同。
如果它通过@nogc
进行编译,它将不会分配(因此不会收集,D GC只会在您要求分配时收集),无论其纯度如何。
答案 1 :(得分:2)
https://dlang.org/spec/attribute.html#nogc
...表示该函数不在GC堆上分配内存, 或者直接使用NewExpression或间接通过 它可以调用的函数,或者通过数组等语言功能 连接和动态闭包。
在函数执行或整体内存使用量增加后,它不会告诉任何有关GC状态的信息。唯一重要的是保证函数本身永远不会调用任何GC分配函数,即您可以使用根本没有链接GC实现的自定义运行时可靠地构建和运行此类函数。
另一个要点是@nogc
不能受优化的影响,因为相同的有效代码必须使用不同的优化级别和不同的编译器进行编译。在@nogc
可以使用之前,任何此类优化都需要在语言规范中成为必需的。
考虑到所有这些,只有满足以下两个条件时,您描述的函数才能获得有效的@nogc
注释:
我觉得这不太可能。