我有一个非常简单的函数,该函数进行调用time(2)
以获取时期并将其作为未装箱的OCaml浮点数返回。
这里的平台是OS X 10.12.6,我已经使用OCaml版本4.03.0和4.04.0进行了测试。
这是 libunixtime.c
#define CAML_NAME_SPACE
#include <time.h>
#include <caml/memory.h>
#define IGNORE_UNUSED(x) ( (void)(x) )
CAMLprim double
ocaml_unixtime(value unit)
{
IGNORE_UNUSED(unit);
return (double) time(NULL);
}
OCaml代码unixtime.ml
如下所示:它返回未装箱的float,并向编译器指示它不执行任何OCaml端分配。
此函数接受少于5个参数,因此似乎只执行一次并将其用于字节码编译器和本机编译器就可以了(https://caml.inria.fr/pub/docs/manual-ocaml/intfc .html#sec397)。
external unixtime : unit -> (float [@unboxed]) =
"ocaml_unixtime" "ocaml_unixtime" [@@noalloc];;
let () = Printf.printf "%f\n" (unixtime ())
这个示例与本机编译器可以很好地工作(尽管我有点担心强制转换double
不是完全正确的事情,但是它可以在我的机器上工作)。
% ocamlopt unixtime.ml libunixtime.c
% ./a.out
1506195346.000000
但是,当使用字节码编译器进行编译并尝试运行时,我会立即遇到段错误。
% ocamlc -custom unixtime.ml libunixtime.c
% ./a.out
Segmentation fault
Exit 139
字节码编译器是否不支持拆箱浮点数?我如何弄清楚字节码和本机编译器的行为为何不同?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句