【问题标题】:Are Hashes ever on the stack in Crystal lang?Crystal lang 的堆栈中是否存在哈希?
【发布时间】:2020-02-19 20:46:57
【问题描述】:

在 Crystal 语言中,是否曾在堆栈上分配过哈希?还是它们总是“堆积”?我在文档中找不到任何内容(https://crystal-lang.org/api/0.33.0/Hash.html - 于 2020 年 2 月 19 日查找)。我在https://github.com/crystal-lang/crystal/blob/master/src/hash.cr 中看到不少malloc_*,但不确定我是否缺少优化。我认为文档没有明确指出 - 在浏览器中对 https://crystal-lang.org/api/0.33.0/Hash.html 上的“堆”、“堆栈”和“分配”进行了单词查找...找不到任何东西。

【问题讨论】:

  • 总是在堆上。 Hash 继承自 Reference 和 Reference 类型总是在堆上分配。
  • 任何 class 都在 Crystal 中,crystal-lang.org/reference/syntax_and_semantics/structs.html 解释了这一点。
  • 就在reference.cr --> #`Reference` is the base class of classes you define in your program. # It is set as a class' superclass when you don't specify one: ...事实上,Hash 没有明确指定的超类。谢谢@asterite 和@jonne-haß
  • 欢迎在这里回答您自己的问题 :)

标签: crystal-lang


【解决方案1】:

哈希总是堆分配的。

在 Crystal 中,这取决于对象的类型是 Reference 还是 Value。从Reference 继承的所有对象始终分配在堆上。

哈希定义为class Hash(K, V)。由于类始终继承自 Reference,因此哈希将始终在堆上分配。

struct Int32 这样需要堆栈分配的值类型必须定义为结构,因此它们不是从Reference 继承,而是从Value 继承。

【讨论】:

    猜你喜欢
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 2021-06-28
    • 2018-04-21
    • 1970-01-01
    • 2012-08-10
    • 2014-06-26
    相关资源
    最近更新 更多