gpt4 book ai didi

c# - 在 .NET 中固定内存对象的生命周期

转载 作者:行者123 更新时间:2023-11-30 15:13:33 26 4
gpt4 key购买 nike

我最近了解到在 .NET 中固定并不是实际过程。它“只是”在 IL 中创建一个固定的局部变量,这个变量指向的所有内容都被 GC 认为是固定的。您可以阅读更多相关信息 here .

现在我想知道:是否可以固定 classstruct 的字段,以便假定它指向的 object由 GC 固定而不使用 GCHandle 左右。像这样的(伪代码!):

public unsafe [class|struct] Something
{
public byte[] Data = new byte[4096];
private /*some keywords*/ byte* ptr = /*some keywords like fixed*/ Data;
}

如果这在普通 C# 中是不可能的,那么在使用 IL 时可以吗?或者structclass 字段不能有固定对象的效果吗? (也许只有局部变量才有可能?)

最佳答案

不是字段,不是。本质上,你在这里是绝对正确的:

Maybe it's only possible for local variables?

是的,它只适用于局部变量。

这里的要点是 GC 不想爬堆来寻找引脚(很高兴查看堆栈 - 它已经需要这样做),并且没有对象的概念 由自己选择固定。

您当然可以使用固定的本地来实现此目的:

fixed(byte* ptr = obj.Data)
{
RunYourMainCode(obj);
}

但这需要固定的局部来跨越需要该方法保留固定的代码。

如果你真的想要某物不动并且你不能使用本地:

  • 使用GCHandle (这就是它为了),或者
  • 使用非托管内存

请注意 Memory<T>Span<T> ,您仍然可以使用托管 代码(即 unsafe 使用率几乎为零)与非托管 内存通信。具体来说,一个 Memory<T>可以在不安全的内存上构造,并且 .Span从中提供ref T访问数据(ref T 是托管指针,对比 T* 是非托管指针;非常相似,但托管指针与 GC 一起工作,不需要 unsafe)。

关于c# - 在 .NET 中固定内存对象的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57885342/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com