【发布时间】:2018-09-10 13:06:28
【问题描述】:
(Elixir 中给出的示例。)
假设我有以下代码,
x = {1, 2}
a1 = {"a", {1, 2}}
a2 = {"a", {1, 2}}
a3 = {"a", x}
据我所知,它在不同的内存位置创建了三个元组{1, 2}。
使用运算符== 或=== 比较任何a 变量总是返回true。这是意料之中的,因为这两个运算符仅在比较数字类型时有所不同(即,1 == 1.0 与 1 === 1.0 不同)。
然后,我尝试通过模式匹配比较结构,使用以下模块(严格创建以测试我的案例),
defmodule Test do
def same?({x, y}, {x, y}), do: true
def same?(_, _), do: false
end
但调用Test.same?(a1, a3) 也会返回true。
如何使用指针相等来比较两个结构,以便确定它们在内存中是否是相同的结构?
谢谢
【问题讨论】:
-
这是一个非常有趣的问题,我希望看到一个答案,并参考 Erlang VM 的工作方式。它将对 Elixir/erlang 机制有所了解。
-
@NathanRipert 我想我已经回答了你正在寻找的方式。
-
您可能会发现:github.com/happi/theBeamBook 有助于回答此类问题。简短的回答:你不应该关心。 Erlang 被有意设计为隐藏这些实现细节。
-
@OnorioCatenacci 是的,我不应该在意。但我应该注意大型结构之间的重复,特别是当重复可能非常大时。正是在这种情况下,为了消除这种重复,我提出了这个问题。请参阅我自己对以下问题的回答。
-
@OnorioCatenacci 如果我理解你担心的事情(谢谢,我很感激),我知道 Erlang 会复制除大型二进制文件之外的所有内容,这意味着它将复制大型结构,从而产生重复再一次,对吧?但是,如果可能具有重复子树的结构始终存在于同一进程中,那么在进程中删除此类重复可以节省大量内存。我说的是在同一进程中压缩大量重复数据。