Arrays 将数组分配到运行时已知大小的堆上 在C++中,我可以把一个1000代码< int >代码> s放在堆上: const size: usize = 1000; // or: = some_const_fn() let values = Box::new([0; size]) int size=1000; int*值=新的int[大小]; 删除[]个值;

Arrays 将数组分配到运行时已知大小的堆上 在C++中,我可以把一个1000代码< int >代码> s放在堆上: const size: usize = 1000; // or: = some_const_fn() let values = Box::new([0; size]) int size=1000; int*值=新的int[大小]; 删除[]个值;,arrays,rust,heap,Arrays,Rust,Heap,我想不出如何在生锈的地方做同样的事情 let size = 1000; let values = Box::new([0; size]) // error: non-constant path in constant expression 据我所知,Rust强制在编译时知道所有数组的大小,并且在创建数组时不允许使用表达式。Rust中的数组是固定长度的。如果需要动态调整大小的数组,请使用Vec。在这种情况下,最简单的方法是使用宏: 此外,如果您非常担心Vec的长度为三个字,并且在创建存储后不需要

我想不出如何在生锈的地方做同样的事情

let size = 1000;
let values = Box::new([0; size]) // error: non-constant path in constant expression

据我所知,Rust强制在编译时知道所有数组的大小,并且在创建数组时不允许使用表达式。

Rust中的数组是固定长度的。如果需要动态调整大小的数组,请使用
Vec
。在这种情况下,最简单的方法是使用宏:

此外,如果您非常担心
Vec
的长度为三个字,并且在创建存储后不需要调整其大小,则可以明确放弃内部容量,并将
值减少到堆栈上的两个字:

let values = values.into_boxed_slice(); // returns a Box<[i32]>.
let values=values.into_boxed_slice();//返回一个框。

如果数组的大小可以在编译时确定*,则可以使用如下常量:

const size: usize = 1000; // or: = some_const_fn() 
let values = Box::new([0; size])

*由于Rust 1.46控制流和循环在
const fn
中受支持,请参见,或。我强烈推荐阅读这本书,因为它涵盖了许多这些介绍性主题。您是如何计算Vec与长方体的默认大小的?一个(长方体)切片只存储指向切片开头的指针,而切片的长度是指针大小的整数。一个
Vec
是一个可增长的数组,因此它为额外的元素分配额外的空间。这意味着
Vec
还必须存储分配的缓冲区的容量(至少与长度一样大)。(因此,将
视为2个指针,将
Vec
视为3个。)