OCaml中的整数、指针和块

OCaml中的整数、指针和块,ocaml,Ocaml,我试图弄清楚OCaml的内存表示 我知道的是: 整数和指针都是一个字大小(32位),最低位设置为区分 块用于装箱更复杂的数据,如记录等 我只是有点不确定他们之间的关系,所以请在这里确认 在上面的例子中,我的理解如下: x是一个整数 {foo=x}是一个块 在{foo=x}中,foo是一个直接值为x的整数(foo不指x的地址) {bar=r1}也是一个块 在{bar=r1}内部,bar的值是指针,它引用{foo=1} 我说的对吗?OCaml还有一个64位内存模型 在同一描述中混合int和指

我试图弄清楚OCaml的内存表示

我知道的是:

  • 整数和指针都是一个字大小(32位),最低位设置为区分
  • 块用于装箱更复杂的数据,如记录等
  • 我只是有点不确定他们之间的关系,所以请在这里确认


    在上面的例子中,我的理解如下:

    • x
      是一个整数
    • {foo=x}
      是一个块
    • {foo=x}
      中,foo是一个直接值为x的整数(foo不指x的地址)
    • {bar=r1}
      也是一个块
    • {bar=r1}
      内部,bar的值是指针,它引用
      {foo=1}


    我说的对吗?

    OCaml还有一个64位内存模型

    在同一描述中混合int和指针没有意义。OCaml中有int,但本身没有指针。它们是一个实现细节。未设置指针的低位;事实上,这就是设置int的低位的原因——以区别于指针


    另外,您的描述在我看来是正确的。

    OCaml还有一个64位内存模型

    在同一描述中混合int和指针没有意义。OCaml中有int,但本身没有指针。它们是一个实现细节。未设置指针的低位;事实上,这就是设置int的低位的原因——以区别于指针


    您的描述在其他方面对我来说是正确的。

    看一下手册(绑定部分)和。

    看一下手册(绑定部分)和。

    看一下,它很好地涵盖了主题。@gsg是,我读了它,开始有点困惑。你可以使用
    Obj
    模块中的函数来检查值并检查它们是否是块,例如:
    Obj.repr r1 |>Obj.is_block
    。看一下,它很好地涵盖了主题。@gsg yes,我读了它,开始有点困惑。您可以使用
    Obj
    模块中的函数来检查值并检查它们是否为块,例如:
    Obj.repr r1 |>Obj.is_block
    type r1_t = {foo : int;}
    
    type r2_t = {bar : r1_t;}
    
    let _ = let x = 1 in let r1 = {foo = x} in {bar = r1}