在F#中,有一个NativePtr模块,但它似乎只支持32位偏移量的add/get/set函数,就像System.IntPtr一样。
在F#中,有没有一种方法可以向本机指针(nativeptr<'a>)添加64位偏移量?当然,我可以将所有地址转换为64位整数,进行常规整数操作,然后再将结果转换回nativeptr<'a>,但这将需要额外的add和imul指令。我真的希望AGU执行地址计算。
例如,在C#中使用unsafe关键字,您可以执行以下操作:
在F#中,有没有一种方法可以向本机指针(nativeptr<'a>)添加64位偏移量?当然,我可以将所有地址转换为64位整数,进行常规整数操作,然后再将结果转换回nativeptr<'a>,但这将需要额外的add和imul指令。我真的希望AGU执行地址计算。
例如,在C#中使用unsafe关键字,您可以执行以下操作:
void* ptr = Marshal.AllocHGlobal(...).ToPointer();
int64 offset = ...;
T* newAddr = (T*)ptr + offset; // T has to be an unmanaged type
实际上,你无法使用“未管理”约束类型参数,因为它没有被定义,但至少你可以以非泛型的方式进行通用指针算术。
在 F# 中,我们终于拥有了“未管理”的约束;但我该如何执行指针算术?