如何获取数组中元素的大小?

Mar*_*nic 2 .net f#

我试图追踪内存损坏错误,我设法得到了大部分的方式.事实证明,ManagedCuda的CudaDeviceVariable类为每个bool元素分配4个字节,而我强烈怀疑F#的本机数组每个bool元素只占用1个字节.该CopyToHost函数假定源和目标的大小相同,导致它写入数组的末尾.

我希望编译器告诉我F#bool []实际上是每个元素1个字节,所以我有最终的证明,并用它来替换错误的ManagedCuda库函数来计算大小.

怎么可能这样呢?

Gen*_*ski 5

您可以通过bool在运行时比较相邻数组元素的事实地址来获得数组元素分配大小的防弹指示:

open System.Runtime.InteropServices

let boolarray = Array.zeroCreate<bool> 2

let elemSize = Marshal.UnsafeAddrOfPinnedArrayElement(boolarray,1) -
               Marshal.UnsafeAddrOfPinnedArrayElement(boolarray,0)
Run Code Online (Sandbox Code Playgroud)

在fsi中评估为

val a : bool [] = [|false; false|]
val elemSize : nativeint = 1n
Run Code Online (Sandbox Code Playgroud)

这有效地表明在我的系统上没有填充的情况下每个元素分配1个字节.