2016-03-22 22 views
3

C#では、私はF#は&とポインタ逆参照機能のアドレスを持っていますか?

unsafe void Main() { 
    float f = 3.14f; 
    int i = *(int*)&f; 
} 

の書き込みは、F#にこのコードを変換することが可能ですか?

私の理解では、ポインタがnativeptr<'a>型で表現されますが、私は私の人生のために私はアドレス参照&*オペレータ間接参照ポインタと同等のものを見つけることができないということです。 I 容疑者NativePtr.getが後者かもしれませんが、its implementationが私を逃げます。私はILをよく理解していません。

私は約BitConverterMarshalを知っていますが、メモリをコピーせずにビットマングリングを実装する方法を探しています。

+0

@GuyCoder:既存のfloatの* bits *をあたかもintであるかのように見たいと思います。 – kkm

+0

これは何の目的ですか?この種のコードを書くことは、ほぼ間違いです。 –

+0

@JohnPalmer:質問にはまったく関係ありませんが、その意図はハッシュです。 – kkm

答えて

5

NativePtr.getおよびsetは、オフセットで読み書きを行います。バイトごとに読み込む必要がある場合は、それを使用します。オフセットゼロで読み込む必要がある場合は、代わりにreadwriteを使うことができますが、それらは若干性能が向上します。

「生」アドレスを取る演算子(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博士が私たちに警告した早すぎる最適化のようなものです。

+0

記録としてはクヌス博士です。 – kemiller2002

+0

Ok。修正しました.. –

+0

彼らは何をしているのか分からないなら、これをしてはならないと私は同意します。しかし、あなたが何をやっているのか、それを必要としているかを知っていれば、それを行うのは非常に良い理由があります。ポインタが必要な場合は、[SafeHandles](https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.safehandle(v = vs.110).aspx)を参照してください。低レベルの操作をたくさん行う必要がある場合は、[System.Runtime.InteropServices](https://msdn.microsoft.com/en-us/library/system.runtime.interopservices(v = vs.100) .aspx) –

関連する問題