【问题标题】:Use cases for const HashMap/BTreeMapconst HashMap/BTreeMap 的用例
【发布时间】:2022-01-04 11:22:23
【问题描述】:

docs 说:

常量项是一个可选命名的常量值,它与程序中的特定内存位置无关。常量在使用时基本上都是内联的,这意味着它们在使用时会直接复制到相关上下文中。

虽然这对于整数、布尔值等“简单”值听起来完全合理,但这是否也意味着对于更复杂/更大的数据结构,例如 HashMap/BTreeMaps,consts效率会很低吗?如果是这样,为什么(在什么情况下)要对此类结构使用 const,而不是不可变的静态变量?

【问题讨论】:

  • 你在如何初始化常量方面也很有限,我相信即使HashMap::new() 也不会这样做
  • 您不能创建const MAP: HashMap<...>,因为没有const fn 可以构造它。 Playground - “常量中的调用仅限于常量函数、元组结构和元组变体”
  • map 和 vecs 等昂贵的数据结构需要调用分配器。分配器不是 const,所以任何使用 alloc 的东西都不能是 const。
  • 其实我不确定HashMap,但BTreeMap 显然工作是in progress,它已经在 Nightly 中可用。
  • 太酷了!但我认为这本身并不是特别有用。你可以创建一个const MAP: BTreeMap<...>,但它总是空的。也许在一般意义上很有用,但这并不真正适合您所询问的“复杂/更大的数据结构”。

标签: rust constants


【解决方案1】:

如果是这样,为什么(在什么情况下)要对此类结构使用 const,而不是不可变的静态变量?

从技术上讲,常量变量是在 Rust 中获取“不可变静态变量”的唯一方法。

其他解决方案,例如 lazy_static,需要在初始化值和跟踪它是否已初始化或存在不安全风险时产生开销。

常量值嵌入到可执行文件的只读数据中,例如字符串或机器代码。这几乎与普通内存一样有效 - 没有任何开销。

const 的另一个原因是constant generics

【讨论】:

  • 您混淆了conststatic。而且我几乎不会提倡 const 泛型 HashMap
  • @ChayimFriedman 不是。常量实际上是静态的——不需要有多个特定常量的实例。而且我的回答与HashMap特别无关。
  • 问题是关于HashMap。而const,与static 不同,可以(并且确实)为每次使用复制粘贴,并且根本不必嵌入到生成的二进制文件中。
猜你喜欢
  • 2021-05-25
  • 2023-03-16
  • 2023-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 2016-06-01
  • 1970-01-01
相关资源
最近更新 更多