【问题标题】:Cstruct and Lwt_bytesCstruct 和 Lwt_bytes
【发布时间】:2018-10-14 08:23:43
【问题描述】:

据我所知,Lwt_bytes 似乎使用与 Cstruct 相同的类型(或者可能使用 cstruct 本身),但出于某种原因,我不能让它们两者一起工作:

Lwt_io.write_from_exactly out b.Cstruct.buffer 0 16


Error: This expression has type
         Cstruct.buffer =
           (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout)
           Bigarray.Array1.t
       but an expression was expected of type bytes

字节不是完全相同的类型吗?我怎样才能做到这一点?为了方便 Cstruct.LE,我正在尝试使用 Cstruct 而不是 Lwt_bytes,这些字节似乎没有。 谢谢

【问题讨论】:

    标签: ocaml ocaml-lwt


    【解决方案1】:

    据我所知,Lwt_io.write_from_exactly 的第二个参数是 bytes 类型(可变 OCaml 字符串),而 Cstruct.buffer 是 8 位整数的 Bigarray。 虽然底层的“有效负载”是相同的(无符号字符的字对齐数组;请参阅Bytes_val 宏),但 OCaml 级别的“值包装器”是不同的(例如,请参阅caml_ba_alloc)。

    您是否尝试过使用Lwt_bytes.to_bytes 从一种转换到另一种?

    不幸的是,这个seems to duplicate and copy the data payload,所以重新考虑你的整体方法可能会更好。您的问题中没有足够的信息来提出更准确的建议。

    【讨论】:

    • 这个答案是正确的。详细说明一下,Lwt_bytes.ts 与 Cstruct 兼容的大数组,但 bytes 是核心 OCaml 类型,即可变字符串类型。命名很混乱,所以很容易认为bytes = Lwt_bytes.t。原因是Lwt_bytes 早在bytes 被作为新类型添加到核心语言之前就已经命名了。 Lwt_io 建立在 bytes 之上,即常规(可变)OCaml 字符串。要使用Lwt_bytes.t 进行I/O,需要使用模块Lwt_bytes(或其他bigarray 库)中的函数。
    • 我还想指出,使用 strings 或 bytes(如在 Lwt_io 中)的异步 I/O 几乎总是比使用大字符串的 I/O(如 Cstruct、@ 987654341@)。这是因为stringbytes 存储由垃圾收集器管理,并且可以移动,因此 Lwt(或任何其他 I/O lib)必须进行内部复制,因此数据的地址保持不变I/O 的持续时间。 Bigstrings (Lwt_bytes.t, Cstruct) 本质上分配有固定存储空间,因此 I/O 不需要复制。不过,Lwt_bytes API(目前)不如Lwt_io 丰富。
    • 我明白了,我确实没有意识到 Lwt_bytes.t 和字节不一样。现在它更有意义了,并且使用字节确实可以正常工作。由于我使用的是 Lwt_io,所以我只是将 cstruct 替换为字节
    猜你喜欢
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多