我怀疑这个功能不存在的原因是实现它很复杂,而且很少有人需要它。为了安全起见,您希望固定可传递地工作,即您希望固定整个可达对象图。但这似乎不是根本无法做到的事情。
例如,假设您有以下课程:
[StructLayout(LayoutKind.Sequential)]
class SomeObject
{
public SomeObject r;
}
您分配的内容如下:
SomeObject o = new SomeObject();
并且您尝试将其固定为:
GCHandle oh = GCHandle.Alloc(o, GCHandleType.Pinned);
你会得到可怕的:
Object contains non-primitive or non-blittable data.
好吧,好吧,我可以忍受。但是假设我可以访问 .NET 的垃圾收集器实现。会有什么障碍?以下是我看到的障碍:
- 循环引用。
- 您希望垃圾收集器将自己限制为应用程序堆内的对象。
- 这可能需要很长时间。
- 使操作原子化将是困难/痛苦的。
在我看来,GC 已经不得不处理其中的一些问题。那我忘记了什么?
注意:在你问“你想完成什么?”等之前,我问的目的是为了研究代码,不一定限于 C#,也不一定限于 CLR。我知道摆弄运行时自己的内存不是典型的场景。无论如何,这不是一个纯粹的推测性问题。
注意2:另外,我不关心编组。我只是担心钉住。