不传递内存的 pure 和 nothrow 函数是否会自动收集垃圾?
Does a pure and nothrow function which does not pass out memory automatically collect garbage?
假设你在 D 中有一个函数是 pure
和 nothrow
并且根据它的 return 类型和参数类型不能传递任何新分配的内存。那我可以给这个函数添加 @nogc
属性吗?如果没有,未来是否有可能实现?
我的观点如下:由于函数没有任何可见的副作用,所有在途中分配的内存都可以在函数退出时确定性地释放。因此,GC 并不是真正需要的,因为可以避免标记和清除步骤。还是不能?
您可以随时尝试添加 @nogc
并编译。纯函数可能仍会分配内部缓冲区,即使它没有 return 任何内部缓冲区,因此垃圾收集的问题与纯度问题在不同的轴上。
如果它通过 @nogc
的编译,它不会分配(因此不会收集,D GC 只会在您要求分配时收集)而不管纯度如何。
https://dlang.org/spec/attribute.html#nogc
... means that that function does not allocate memory on the GC heap,
either directly such as with NewExpression or indirectly through
functions it may call, or through language features such as array
concatenation and dynamic closures.
函数执行后或总体内存使用量增加后,它不会说明任何有关 GC 状态的信息。唯一重要的是函数本身保证永远不会调用任何 GC 分配函数,即你可以可靠地构建和 运行 这样的函数,自定义 运行time 没有链接 GC 实现全部.
另一个重点是 @nogc
不会受到优化的影响,因为相同的有效代码必须使用不同的优化级别和不同的编译器进行编译。在 @nogc
可以使用它之前,任何此类优化都需要在语言规范中成为强制性的。
考虑到所有这些,只有在满足以下两个条件时,您描述的函数才能获得有效的 @nogc
注释:
- 它实际上根本不进行任何 GC 调用,它已完全优化
- 这种优化是强制性的,并且保证在这种情况下对于所有符合语言规范的编译器总是发生
我认为极不可能。
假设你在 D 中有一个函数是 pure
和 nothrow
并且根据它的 return 类型和参数类型不能传递任何新分配的内存。那我可以给这个函数添加 @nogc
属性吗?如果没有,未来是否有可能实现?
我的观点如下:由于函数没有任何可见的副作用,所有在途中分配的内存都可以在函数退出时确定性地释放。因此,GC 并不是真正需要的,因为可以避免标记和清除步骤。还是不能?
您可以随时尝试添加 @nogc
并编译。纯函数可能仍会分配内部缓冲区,即使它没有 return 任何内部缓冲区,因此垃圾收集的问题与纯度问题在不同的轴上。
如果它通过 @nogc
的编译,它不会分配(因此不会收集,D GC 只会在您要求分配时收集)而不管纯度如何。
https://dlang.org/spec/attribute.html#nogc
... means that that function does not allocate memory on the GC heap, either directly such as with NewExpression or indirectly through functions it may call, or through language features such as array concatenation and dynamic closures.
函数执行后或总体内存使用量增加后,它不会说明任何有关 GC 状态的信息。唯一重要的是函数本身保证永远不会调用任何 GC 分配函数,即你可以可靠地构建和 运行 这样的函数,自定义 运行time 没有链接 GC 实现全部.
另一个重点是 @nogc
不会受到优化的影响,因为相同的有效代码必须使用不同的优化级别和不同的编译器进行编译。在 @nogc
可以使用它之前,任何此类优化都需要在语言规范中成为强制性的。
考虑到所有这些,只有在满足以下两个条件时,您描述的函数才能获得有效的 @nogc
注释:
- 它实际上根本不进行任何 GC 调用,它已完全优化
- 这种优化是强制性的,并且保证在这种情况下对于所有符合语言规范的编译器总是发生
我认为极不可能。