簡體   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