为什么需要使用enif_compare?

时间:2013-02-04 18:54:16

标签: erlang

为什么

int enif_compare(ERL_NIF_TERM lhs, ERL_NIF_TERM rhs)
需要使用

而不仅仅是

if( lhs == rhs ) return 1;

我认为我比较原子很重要。

1 个答案:

答案 0 :(得分:4)

ERL_NIF_TERM是一种不透明的数据类型,据我所知,它更类似于指针而不是值。实际上,这里的定义是:typedef unsigned long ERL_NIF_TERM(技术上有一些变体,但它们都是整数,与系统上的内存地址大小相同

因此,您必须使用enif_compare,原因与比较C字符串时必须使用str_cmp的原因相同:引用的值可能相同,但您获得的值并不能代表它。

考虑:

char a[] = "test";
char b[] = "test";
printf("%d\n", a == b);

逻辑上,您和我知道字符串是相同的,但值ab实际上是指向包含值的指针。因此,当您进行常规比较(==)时,它会比较指针,而不是基础值。由于它们是函数中的不同值,因此它们被分配到不同的内存地址,因此a != b,但str_cmp(a, b) == true