gpt4 book ai didi

pointers - F# 是否有地址 & 和指针取消引用 * 函数?

转载 作者:行者123 更新时间:2023-12-04 23:17:42 30 4
gpt4 key购买 nike

在 C# 中,我写

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

是否可以将此代码转换为 F#?

我的理解是指针由 nativeptr<'a> 表示。类型,但我一生都找不到地址引用 & 的等效项和指针取消引用 *运营商。我怀疑 NativePtr.get可能是后者,但 its implementation逃脱了我,因为我不太了解 IL。

我知道 BitConverterMarshal ,但我正在寻找一种无需复制内存即可实现位重整的方法。

最佳答案

NativePtr.getset函数以偏移量读取和写入。如果您需要逐字节读取,请使用它。如果需要在零偏移处读取,可以使用 readwrite相反,它们的性能会稍微提高一些。

获取“原始”地址(与 byref<_> 引用相对)的运算符称为 && ( see definition )。

但是还有更多的技巧,比如:你需要标记变量mutable在获取它的地址之前,你不能只存储一个 nativeptr<_>值,您需要将其转换为 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

或者更紧凑的版本:
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
()

说了这么多,我完全同意 John Palmer 和 GuyCoder: 请不要这样做 如果可能的话。这看起来正是 Knuth 博士警告我们的那种过早优化。

关于pointers - F# 是否有地址 & 和指针取消引用 * 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36166554/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com