gpt4 book ai didi

c# - 编码指向数组 P/Invoke 的指针

转载 作者:太空宇宙 更新时间:2023-11-03 19:42:19 25 4
gpt4 key购买 nike

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

最佳答案

不可以,您不能创建指向已由外部内存管理器分配的非托管内存的数组。但是,您可以创建一个 Span<T>Memory<T>确实如此,这为您提供了一个非常相似的 API 并且意味着您不需要 unsafe之后的任何时候。请注意,为了能够将其存储在任何地方,它必须是 Memory<T>。 ( Span<T> 是一个 ref struct ) - 但一个 Memory<T>本质上只是一个按需跨度提供者 - 当您需要跨度时,请调用 .Span在你的 Memory<T> .

现在;没有Memory<T>用于处理开箱即用的原始指针,但编写一个很简单。或者你可以只使用 this one I wrote earlier (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> 在同一内存上 - 而不是副本)。

关于c# - 编码指向数组 P/Invoke 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51568009/

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