为了账号安全,请及时绑定邮箱和手机立即绑定

Memory<T>.Span 中的内存是如何取消固定的?

Memory<T>.Span 中的内存是如何取消固定的?

C#
慕慕森 2022-10-23 16:51:19
我相信以下两段代码应该是等效的:// first examplestring s = "Hello memmory";ReadOnlyMemory<char> memory = s.AsMemory();using (MemoryHandle pin = memory.Pin()){    Span<char> span = new Span<char>(pin.Pointer, 1);    Console.WriteLine(span[0]);}// second exampleReadOnlySpan<char> span2 = memory.Span;Console.WriteLine(span2[0]);两个代码都将打印“H”。我不明白的是第二个示例中的内存取消固定在哪里。据我了解,字符串是在MemoryHandle堆上分配的,固定它并从指针创建跨度。MemoryHandle.Dispose取消固定记忆。我相信也memory.Span必须固定内存,否则 span 无法访问指针。但是第二个例子中的内存是如何取消固定的呢?
查看完整描述

2 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

最后一个假设是不正确的:memory.Span不需要固定内存,因为垃圾收集器知道它的底层引用。如果您想将指针传递给本机 API,则固定是独立可用的。



查看完整回答
反对 回复 2022-10-23
?
慕标5832272

TA贡献1966条经验 获得超4个赞

Span 仅存在于当前方法线程的堆栈上,而不存在于它的堆上,因此只要您在那里使用它,它就会一直存在。到目前为止很清楚。


现在有趣的部分:


明确的事实是,结果memory.Span不是固定的,而是仅通过使用GarbageCollector 也观察到的托管指针的 .net 概念ref T内部来引用。Span<T>


只要您的记忆还存在,您的跨度也将如此,由此您的跨度。


参考:


https://msdn.microsoft.com/en-us/magazine/mt814808.aspx?f=255&MSPPError=-2147217396 https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/ ref#ref-struct-types


查看完整回答
反对 回复 2022-10-23
  • 2 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号