gpt4 book ai didi

c# - F# 指针成员访问器

转载 作者:太空狗 更新时间:2023-10-29 21:43:25 27 4
gpt4 key购买 nike

有没有什么方法可以访问 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> 的严格类型化type 意味着您不能简单地转换为相关的指针类型。 NativePtr.set offset ptr函数添加 sizeof<'T> * offset ,所以这在这种情况下也没有用。

假设类型 myStructurePacked属性,为简单起见。 a 的偏移量为 0 , 4 表示 b .抛开所有谨慎,完全放弃托管内存领域,我们可以做:

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

关于处理这些情况的最佳方法是什么,我留下了一个悬而未决的问题,如果它们必须被处理的话。我倾向于使用第一种最清晰的方法,但要以额外的内存使用为代价。最后,要不惜一切代价避免使用任意偏移方法——如果你必须处理添加原始偏移,最好将它们包装在一个更容易验证的函数中,如第二种方法,这样调用者就不需要计算偏移本身。

关于c# - F# 指针成员访问器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40685519/

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