[英]F# pointer member accessor
有什么方法可以訪問NativePtr
結構的成員並NativePtr
分配值,就像在下面的示例中使用C#一樣?
(來自MSDN)
CoOrds* p = &home; p -> x = 25;
當前,我正在使用NativePtr.write
,但是我不確定這是否是最佳/正確的解決方案。
謝謝。
假設您必須以這種方式處理struct
,那么您描述的方式是最清晰的方法。 為了完整起見,這里是該方法(省略了打包的實現細節):
open FSharp.NativeInterop
[<StructLayout(...)>]
type myStructure =
struct
val mutable a : int
val mutable b : byte
end
let changeA pointer newA =
let mutable structure = NativePtr.read pointer
structure.a <- newA
NativePtr.write pointer structure
但是,由於必須知道每個元素的確切偏移量,因此也可以使用此信息直接寫入該字段。 F#沒有提供使用命名標識符執行此操作的方法,其嚴格輸入的nativeptr<'T>
類型意味着您不能簡單地轉換為相關的指針類型。 NativePtr.set offset ptr
函數添加sizeof<'T> * offset
,因此在這種情況下也沒有用。
為了簡單起見,假設類型myStructure
具有Packed
屬性。 那么, a
的偏移量為0, b
的偏移量為4。 我們全力以赴,完全放棄了托管內存的領域,我們可以這樣做:
let changeB pointer newB =
let bPtr =
NativePtr.toNativeInt pointer
|> (+) 4n
|> NativePtr.ofNativeInt<byte>
NativePtr.write bPtr newB
甚至:
let changeMember pointer offset (value : 'T) =
let pointer' =
NativePtr.toNativeInt pointer
|> (+) (nativeint offset)
|> NativePtr.ofNativeInt<'T>
NativePtr.write pointer' value
對於這些情況的最佳解決方法是什么(如果必須加以處理),則是一個懸而未決的問題。 我傾向於采用第一種最清晰的方法,但會占用更多的內存。 不惜一切代價避免使用最后一個任意偏移量方法-如果必須處理添加原始偏移量,最好將它們包裝在像第二種方法那樣更易於驗證的函數中,因此調用者無需計算偏移量本身。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.