给定OCaml中的任何数组,我想通过首先获取它的类型来获得数组元素的大小。
# let element_type = Array.element_type arr;;
# let element_size = of_int (sizeof element_type);;
但是,函数Array.element似乎不再可用。我还能做什么?
答案 0 :(得分:4)
类型不是值,它没有任何内存中表示。类型仅存在于源代码中,并由类型检查器用于静态验证是否存在某些运行时错误。在编译期间,类型将从程序中删除。没有类型的运行时表示,就像Java和C ++等其他语言一样。
所有值均在OCaml中统一表示,可以是立即整数,也可以是指向堆的指针。因此,所有值都具有相同的大小,即等于机器字的大小。此外,严格来说,值表示是特定于实现的,您不应该直接访问它。 OCaml不是C,它负责内存表示(并对其进行抽象)。所以试图挖掘它的内部是一个坏主意。
在评论中澄清后,很明显你在谈论Ctypes库中的数组类型。 Ctypes库提供了C语言的接口(在两个方向上),并将C类型表示为OCaml值。它们还提供CArray.t
类型,将C Arrays表示为OCaml值。对于该阵列,您肯定可以通过使用Ctypes.CArray.element_type
函数来获得大小,例如,
let sizeof_element arr = sizeof (CArray.element_type arr)
答案 1 :(得分:2)
OCaml是静态类型的。 (通常)在运行时没有办法谈论类型或它们的大小。
另一方面,没有什么能阻止模块为类型创建自己的编码。例如,Bigarray模块就是这样做的。可能这就是你的想法。
# let a = Bigarray.Array1.create Bigarray.int16_unsigned
Bigarray.c_layout 100;;
val a :
(int, Bigarray.int16_unsigned_elt, Bigarray.c_layout)
Bigarray.Array1.t = <abstr>
# Bigarray.kind_size_in_bytes (Bigarray.Array1.kind a);;
- : int = 2