c# - 内存中的内存是如何取消固定的。跨度?
问题描述
我相信以下两段代码应该是等效的:
// first example
string 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 example
ReadOnlySpan<char> span2 = memory.Span;
Console.WriteLine(span2[0]);
两个代码都将打印“H”。
我不明白的是第二个示例中的内存取消固定在哪里。
据我了解,字符串是在MemoryHandle
堆上分配的,固定它并从指针创建跨度。MemoryHandle.Dispose
取消固定记忆。
我相信也memory.Span
必须固定内存,否则 span 无法访问指针。但是第二个例子中的内存是如何取消固定的呢?
解决方案
最后一个假设是不正确的:memory.Span
不需要固定内存,因为垃圾收集器知道它的底层引用。如果您想将指针传递给本机 API,则固定是独立可用的。
推荐阅读
- python - 更改变量名并动态创建新变量名
- python - pandas 如何获得 groupby 的结果并进行比较?
- reactjs - Material-UI Typescript 如何在组件类中从 makeStyle() 创建样式实例
- assembly - 汇编语言是否有非处理器特定的指令?
- mongodb - 使用用于 logstash 的 mongoDB 输入插件将多个集合发送到 elasticsearch
- macos - 搜索多个文件并将它们复制到同一目录中
- git - 使用 Filter-Repo 的快速导入崩溃 - 将文件添加到根提交
- apache-spark - AWS:具有多主节点设置的 EMR。如何获得活跃的主节点
- apl - foldr vs foldl 作为 APL 中的 reduce 运算符
- node.js - What is the right way to query Polkadot js for a Substrate storage key?