【问题标题】:Why must items on the stack have a size that's known at compile time?为什么堆栈上的项目必须具有在编译时已知的大小?
【发布时间】:2020-12-02 17:17:00
【问题描述】:

我明白为什么它们必须具有恒定大小,但我不明白为什么必须在编译时知道该大小。甚至 C 也允许堆栈上的可变长度数组。这个限制对 Rust 有什么帮助?

【问题讨论】:

标签: rust


【解决方案1】:

甚至 C 也允许在堆栈上使用可变长度数组。

C 可以相对容易地支持这一点,因为它的语义很简单。

当您必须调用 destructors/drop 时,这要简单得多,因此 Rust 最初并不支持它,因为它努力实现并且没有带来太多好处。

感谢RFC 1909 — unsized rvalues,Rust 最终将支持这一点(以及already does on nightly)。

【讨论】:

  • 已经这样做了——学究式,不完全是:"VLAs are not implemented yet"
  • 这远没有那么简单——我很想知道为什么添加析构函数会使这变得更难;对我来说这不是一个明显的飞跃。
  • 举个例子,Drop 类型的 VLA 需要存储对象计数,以便在放置时正确迭代。
  • 不管元素是否实现Drop,它是否必须始终存储对象计数以禁止越界索引(从而导致内存不安全)?
  • 嗯,没错。坦率地说,我不知道具体的陷阱。我只记得我在 Clang 工作时,其他开发人员抱怨必须在 C++ 中支持 VLA。
猜你喜欢
  • 2020-06-13
  • 1970-01-01
  • 1970-01-01
  • 2016-11-26
  • 1970-01-01
  • 2013-12-11
  • 2012-08-11
  • 2021-07-31
  • 2022-10-15
相关资源
最近更新 更多