将数组分配到堆上,其大小在运行时已知

Bra*_*ean 6 arrays heap rust

在C++中,我可以将1000个数组int放到堆上,如下所示:

int size = 1000;
int* values = new int[size];
delete[] values;
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何在Rust中执行等效操作.

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

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

DK.*_*DK. 19

Rust中的数组是固定长度的.如果您想要一个动态大小的数组,请使用Vec.在这种情况下,最简单的方法是使用vec!宏:

let size = 1000;
let values = vec![0; size];
Run Code Online (Sandbox Code Playgroud)

此外,如果您非常担心Vec长度为三个字,并且在创建后不需要调整存储大小,则可以明确地丢弃内部容量,并values在堆栈中调低两个字:

let values = values.into_boxed_slice(); // returns a Box<[i32]>.
Run Code Online (Sandbox Code Playgroud)

  • (装箱的)切片仅存储指向切片开头的指针以及作为指针大小的整数的切片长度。“Vec”是一个“可增长”数组,因此它为其他元素分配额外的空间。这意味着“Vec”还必须存储分配的缓冲区的容量(至少与长度一样大)。(因此,将 `Box&lt;[_]&gt;` 视为 2 个指针,将 `Vec&lt;_&gt;` 视为 3 个指针。) (3认同)