【发布时间】:2018-09-05 17:18:43
【问题描述】:
随着在 C# 7.2 中引入 Memory、Span 和 ArraySegment,我想知道是否可以将非托管数组表示为可枚举的对象,它存在于堆上。
后一个要求排除了Span,它基本上实现了我想要的:例如
unsafe { bytes = new Span<byte>((byte*)ptr + (index * Width), Width);
是否可以对ArraySegment 或Memory 做同样的事情?他们的构造函数只接受byte[],也许有办法欺骗C# 传递byte* 而不是byte[]?
【问题讨论】:
-
为什么要使用
Span或Memory执行此操作?您可以Marshal.GlobalHAlloc并获得IntPtr直接使用一组非托管内存。您可能能够以某种方式将其转换为可以传递给这些对象的byte[]。您是要创建一个新的内存块来处理,还是要访问另一个进程内存块? -
我正在使用 SkiaSharp 加载我逐字节迭代的图像。目前我使用提供的属性将数据复制为
byte[]以使用,但 Skia 还提供了指向非托管内存的本机指针,我想探索它,因为它为我节省了内存副本。 -
@RonBeyer
Memory<byte>实际上是完美的... -
@MarcGravell 我同意现在我了解用例是什么,但我不知道自定义
MemoryManager<T>,谢谢!
标签: c# unmanaged-memory