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

时间:2017-01-18 03:38:15

标签: arrays rust heap

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

int size = 1000;
int* values = new int[size];
delete[] values;

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

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

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

2 个答案:

答案 0 :(得分:15)

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

let size = 1000;
let values = vec![0; size];

此外,如果您超级担心Vec长达三个字,并且在创建后不需要调整存储空间大小,那么可以明确地丢弃内部容量,并将values降低到堆栈中的两个单词:

let values = values.into_boxed_slice(); // returns a Box<[i32]>.

答案 1 :(得分:1)

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

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

* 由于 const fn 支持 Rust 1.46 控制流和循环。