Pointers F#是否有&;的地址;和指针解引用*函数?

Pointers F#是否有&;的地址;和指针解引用*函数?,pointers,f#,inline,unsafe,byref,Pointers,F#,Inline,Unsafe,Byref,我用C写 有可能把这个代码翻译成F#吗 我的理解是,指针由nativeptr函数表示,nativeptr.get和set函数以偏移量读取和写入。如果你需要一个字节一个字节地读,那么就用它。如果需要在偏移量为零时读取,可以使用读取和写入,它们的性能会稍高一些 获取“原始”地址(与byref引用相反)的运算符称为&&() 但是还涉及到一些技巧,例如:在获取变量地址之前,需要标记变量mutable,不能只存储nativeptr值,需要将其转换为nativeint,加上nativeptr值是强类型的,因

我用C写

有可能把这个代码翻译成F#吗


我的理解是,指针由
nativeptr函数表示,
nativeptr.get
set
函数以偏移量读取和写入。如果你需要一个字节一个字节地读,那么就用它。如果需要在偏移量为零时读取,可以使用
读取
写入
,它们的性能会稍高一些

获取“原始”地址(与
byref
引用相反)的运算符称为
&&
()

但是还涉及到一些技巧,例如:在获取变量地址之前,需要标记变量
mutable
,不能只存储
nativeptr
值,需要将其转换为
nativeint
,加上
nativeptr
值是强类型的,因此,您需要通过
nativeint
等在它们之间进行转换

以下代码片段将与您的C#代码等效(为了更加清晰,将逐步使用完整的类型注释):

打开FSharp.NativeInterop
让Main()=
设可变x:float=3.1415
让floatPtr:nativeint=NativePtr.toNativeInt&&x
让intPtr:nativeptr=floatPtr |>nativeptr.ofnational环境
设为asInt:int=NativeInterop.NativePtr.read intPtr
愚蠢的
或更紧凑的版本:

open FSharp.NativeInterop

let Main() =
  let mutable x = 3.1415
  &&x |> NativePtr.toNativeInt |> NativePtr.ofNativeInt |> NativePtr.read<int>
打开FSharp.NativeInterop
让Main()=
设可变x=3.1415
&&x |>NativePtr.tonativeeint |>NativePtr.ofnativeeint |>NativePtr.read
或将其打包以重复使用:

// 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
  ()
//val内联readAs:x:'a->'b当'a:非托管和'b:非托管
让内联readAs(x:'a):'b=
设可变x'=x

&&x'|>NativePtr.tonativeeint |>NativePtr.ofnativeeint |>NativePtr。read@GuyCoder:我想把一个现有浮点的位看作是一个int。这是为了什么?写这种代码几乎肯定是个坏主意。@JohnPalmer:这与问题完全无关,但目的是散列。@GuyCoder:请你不要对我的意图进行人身攻击,尤其是在事先不了解他们的情况下?对于nativeptr ops,我同意,如果他们不知道自己在做什么,就不应该这样做。然而,如果你知道自己在做什么并且需要它,那么有很好的理由去做。如果您确实需要指针,请查看。如果你需要做大量的低级操作,请看“就是这样”,谢谢!很难看,但很有意思。至于我为什么需要它,我从上面复制了我的评论:“[…]我需要对一些内部集合进行位散列。在
BitConverter
中有
doubleToInt64bit
(我不需要),但没有
singleToInt32bit
(我需要,并且不超过
*(int*)&值
。如果只是创建一个单独的C#函数库就更愚蠢了!”的确,我喜欢功能性和纯粹性的东西,但有时那些肮脏的部分仍然会侵入。哦,顺便问一下,
内联
的使用真的有理由吗?为什么?声明中没有“插入符号”静态类型(
^T
'T
相对)。我是否错过了
inline
关键字的另一个用例?不,
inline
严格来说不是必需的。但是,如果您追求性能,额外的函数调用是一件大事。我错误地假设您追求性能,因为您要求的是指针算法。请注意,C#的
float
被称为float32
open FSharp.NativeInterop

let Main() =
  let mutable x = 3.1415
  &&x |> NativePtr.toNativeInt |> NativePtr.ofNativeInt |> NativePtr.read<int>
// 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
  ()