Rust 为什么堆栈上的项目的大小必须为';编译时知道什么?

Rust 为什么堆栈上的项目的大小必须为';编译时知道什么?,rust,Rust,我知道为什么它们必须有恒定的大小,但我不明白为什么必须在编译时知道大小。甚至C也允许在堆栈上使用可变长度数组。这种限制有助于生锈的原因是什么 甚至C也允许在堆栈上使用可变长度数组 C可以相对容易地支持这一点,因为它的语义很简单 当您必须调用析构函数/drop时,这就不那么琐碎了,所以Rust最初并不支持它,因为它需要努力实现,并且没有给您带来那么多好处 最终,锈迹会支持这一点,多亏了。另请参见;甚至C也允许-C允许很多不好的事情。一种语言允许某些东西的事实并不能使它变得好。@Shepmaster

我知道为什么它们必须有恒定的大小,但我不明白为什么必须在编译时知道大小。甚至C也允许在堆栈上使用可变长度数组。这种限制有助于生锈的原因是什么

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

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

当您必须调用析构函数/
drop
时,这就不那么琐碎了,所以Rust最初并不支持它,因为它需要努力实现,并且没有给您带来那么多好处


最终,锈迹会支持这一点,多亏了。

另请参见;甚至C也允许-C允许很多不好的事情。一种语言允许某些东西的事实并不能使它变得好。@Shepmaster:问题在于选择这种语言的技术原因是什么,而不是VLAs看起来有多有用,但一种功能必须至少有一个好的用途,否则技术原因可能是“没有很好的理由支持它”。我并不是说VLA有用或没用,只是说“C可以做X”是一个薄弱的论点。C11删除此功能的原因是:palready有——学究式的,不完全是:这远没有那么琐碎——我想了解为什么添加析构函数会使这变得更难;这对我来说并不是一个明显的飞跃。例如,一个
Drop
类型的VLA需要存储对象计数,这样它就可以在Drop上正确地迭代。它不是必须始终存储对象计数才能禁止越界索引(从而导致内存不安全),不管元素是否实现
Drop
?嗯,是的。坦率地说,我不知道具体的陷阱。从我在CLAN上工作的时候我就记得其他的开发者抱怨在C++中支持VLAs。