gpt4 book ai didi

ocaml - OCaml中占8位的图元

转载 作者:行者123 更新时间:2023-12-05 02:35:52 24 4
gpt4 key购买 nike

我惊讶地发现,在使用 Spacetime 时为了分析我的 OCaml,我的 char 甚至 bool 数组都使用一个词来表示每个元素。在我的 64 位机器上这是 8 个字节,会导致使用太多内存。

我已尽可能将 char array 替换为 Bytes,但我也有 char list 和动态数组(char BatDynArray )。是否有一些原始或通用方法可用于所有这些矢量数据结构并获得底层 8 位表示?

最佳答案

编辑:我读你的问题太快了:你可能已经知道了;对不起!这里有一个更有针对性的答案。

我认为存储不同数量的不同数量的字符(即在执行 IO 时)的一般建议是使用缓冲区,可能会调整大小。 Module Buffer实现了一个可调整大小的字符缓冲区,它比 char list(糟糕的设计,除了可能非常短的列表)和 char BatDynArray(其通用性在这里会导致内存损失,正如你注意到的那样)。


以下为原答案。

这是由于值的统一表示。无论它们是什么类型,每个 OCaml 值都是一个机器字:立即值(任何可以容纳 31 位或 63 位整数的值,所以 int charbool 等),或指向 block 的指针,即机器字序列(C 风格数组),前缀为 header 。当值是指向 block 的指针时,我们说它是“装箱的”。

OCaml array 的单元格始终是机器字。

在 OCaml 中,就像在 C++ 中一样,但没有特别的重载,我们只是在我们真正想要节省空间的少数情况下定义 array 的特化。在你的情况下:

  • 使用string(不可变)或bytes(可变)或Buffer.t( 可变 可追加且可调整大小);这些类型向 GC 发出信号,表明它们的单元格永远不是指针,因此它们可以打包任意二进制数据;
  • 不幸的是,标准库没有专门针对bool array,但我们可以实现一个(例如使用bytes);你可以在几个第三方库中找到一个,例如 module CCBV package containers-data 中的(“位向量”) .

最后,您可能还没有意识到,float 是装箱的!这是因为它们需要 64 位(IEEE 754 double ),这比可用于立即数的 31 位甚至 63 位要多。幸运的是(?),编译器和运行时有一些特别的东西来尽可能避免装箱它们。特别是 float array 被特别优化,因此它存储原始 float 而不是指向它们的指针。


更多背景知识:我们可以通过测试一位来区分指针和立即数。统一表示对于以下方面非常有值(value):

  • 实现垃圾收集,
  • 免费参数多态性(没有代码重复,与您在 C++ 等模板语言中获得的相比)。

关于ocaml - OCaml中占8位的图元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70434946/

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