NativePtr.get
およびset
は、オフセットで読み書きを行います。バイトごとに読み込む必要がある場合は、それを使用します。オフセットゼロで読み込む必要がある場合は、代わりにread
とwrite
を使うことができますが、それらは若干性能が向上します。
「生」アドレスを取る演算子(byref<_>
参照と対照的に)は(see definition)と呼ばれます。
しかし関わるいくつかのより多くの策略のような、そこにある:あなたは、あなただけのnativeptr<_>
値を格納することはできませんあなたは、そのアドレスを取ることができます前に、変数mutable
をマークする必要があり、あなたはnativeint
に変換する必要があり、プラスnativeptr<_>
あなたがnativeint
を経由して、それらの間で変換する必要があるので、値は、次のコードは、あなたのC#コード(ステップバイと増加明確にするための完全な型注釈付きステップ)と同等のものを行います
など、強く型付けされている:
open FSharp.NativeInterop
let Main() =
let mutable x: float = 3.1415
let floatPtr: nativeint = NativePtr.toNativeInt<float> &&x
let intPtr: nativeptr<int> = floatPtr |> NativePtr.ofNativeInt<int>
let asInt: int = NativeInterop.NativePtr.read intPtr
asInt
よりコンパクトなv ERSION:再利用のため
open FSharp.NativeInterop
let Main() =
let mutable x = 3.1415
&&x |> NativePtr.toNativeInt |> NativePtr.ofNativeInt |> NativePtr.read<int>
か、それをパッケージ化:上記は、私は完全にジョン・パーマーとGuyCoderに同意するすべての
// val inline readAs : x:'a -> 'b when 'a : unmanaged and 'b : unmanaged
let inline readAs (x: 'a) : 'b =
let mutable x' = x
&&x' |> NativePtr.toNativeInt |> NativePtr.ofNativeInt |> NativePtr.read<'b>
let Main() =
let i = readAs 3.1415 : int
()
は言った:が可能で、すべての場合に、このをしないでください。これはKnuth博士が私たちに警告した早すぎる最適化のようなものです。
@GuyCoder:既存のfloatの* bits *をあたかもintであるかのように見たいと思います。 – kkm
これは何の目的ですか?この種のコードを書くことは、ほぼ間違いです。 –
@JohnPalmer:質問にはまったく関係ありませんが、その意図はハッシュです。 – kkm