[英]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.