【问题标题】:what is entries shared when update a tuple?更新元组时共享的条目是什么?
【发布时间】:2017-11-06 03:04:19
【问题描述】:

在官方文档中:https://elixir-lang.org/getting-started/basic-types.html 说:

iex> tuple = {:a, :b, :c, :d}
iex> put_elem(tuple, 2, :e)
{:a, :b, :e, :d}

请注意,这仅适用于元组本身,而不适用于其内容。为了 例如,当您更新元组时,所有条目都在 旧元组和新元组,已被替换的条目除外。在 换句话说,Elixir 中的元组和列表能够共享它们的 内容。这减少了语言的内存分配量 需要执行并且只有在不可变的情况下才有可能 语言的语义。

这是否意味着:在更改元组期间,新旧元组使用相同的内存地址共享数据,而不是像在 erlang 中那样分配新内存?

【问题讨论】:

    标签: elixir


    【解决方案1】:

    这意味着元组中的值没有被克隆。

    例如,Erlang 中的一个小整数占用 1 个字的内存,一个元组占用 2 个字 + 每个元素的大小。如果您现在创建一个元组{{1, 2, 3}, {4, 5, 6}},那就是2 + (2 + 3) + (2 + 3) = 12 记忆单词。

    如果您现在使用put_elem(tuple, 1, 4) 创建{{1, 2, 3}, 4},它不会克隆原始元组({1, 2, 3})的索引 0 处的元素,而只会创建一个大小为 2 + 整数 @ 的新元组987654327@。此更新不使用额外的2 + (2 + 3) + 1 内存字,而是仅使用2 + 1 额外的内存字。值{1, 2, 3} 在两个元组之间共享。

    Source for the amount of memory used by different data structures in Erlang.

    就像在 erlang 中一样?

    是的,Elixir 中的元组与 Erlang 中的元组具有相同的语义。

    【讨论】:

      猜你喜欢
      • 2018-01-30
      • 1970-01-01
      • 2013-07-26
      • 2014-01-24
      • 2011-06-05
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多