繁体   English   中英

编组指向数组P / Invoke的指针

[英]Marshalling pointer to array P/Invoke

我正在使用P/Invoke.NET Core中包装一个共享对象库(FFTW) FFTW需要分配可能在特定边界上对齐的内存,因此我需要使用其内存分配例程。 理想情况下,我想避免在托管数组中创建单独的内存块,并避免每次使用时复制数据。 理想情况下,创建数组以指向已分配的内存。 这是可能的,还是我应该放弃并承担副本的性能问题?

不,您不能创建一个指向由外部内存管理器分配的非托管内存的数组 但是,您可以创建一个可以执行的Span<T>Memory<T> ,这将为您提供非常相似的API,并且此后您都不需要unsafe 请注意,要能够将其存储在任何地方,它必须是Memory<T>Span<T>ref struct )-但是Memory<T>本质上只是按需跨度提供程序-当您需要span,在您的Memory<T>上调用.Span

现在; 没有开箱即用的用于处理原始指针的Memory<T> ,但是编写一个很简单。 或者,您也可以使用我之前写的内容MemoryManager<T>是一种抽象,可以用于实现自定义Memory<T>实例,然后在需要时可以提供Span<T> )。

用法:

int* ptr = ...
int len = ...

var memory = new UnmanagedMemoryManager<int>(ptr, len).Memory;
// (I should probably add a helper method for that!)

它为您提供了一个Memory<int> ,您可以将其存储在字段等中; 然后使用它,您需要跨度:

var span = _memory.Span;
span[42] = 119; // etc

您还可以执行跨范围的强制类型转换之类的操作,从而允许它们执行指针可以执行的大多数相同操作(即,可以将int*强制为byte* ,也可以转换Span<int>移至同一内存上Span<byte> -而不是副本)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM