rust 将数组分配到运行时已知大小的堆上

px9o7tmv  于 2023-04-30  发布在  其他
关注(0)|答案(4)|浏览(165)

在C++中,我可以像这样将一个1000 int s的数组放在堆上:

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强制所有数组的大小在编译时已知,并且不允许在创建数组时使用表达式。

umuewwlo

umuewwlo1#

Rust的堆分配数组是std::Vec。在引擎盖之下,它只是一个数组(阅读文档中的**§保证**:https://doc.rust-lang.org/std/vec/struct.Vec.html#guarantees)
要分配未初始化的内存,请使用Vec::with_capacity()。然后根据需要push()值:

// preallocate the vector capacity
let mut values = Vec::<i32>::with_capacity(1000);

// fill the vector with values
for i in 0..1000 {
    values.push(i);
}

// downgrade into a boxed slice
let mut values = values.into_boxed_slice();
pdtvr36n

pdtvr36n2#

如果你想要一个数组在堆(e.例如,Box<[u8; 100]>)而不是切片(例如,例如Box<[u8]>),那么从Rust 1开始。66你可以使用Box的TryFrom<Vec<T>>从一个与数组大小相同的Vec转换。如果容量也匹配,则没有拷贝。

let array_on_heap: Box<[u8; 1000]> = vec![0_u8; 1000].try_into().unwrap();
62lalag4

62lalag43#

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

const size: usize = 1000; // or: = some_const_fn() 
let values = Box::new([0; size])
  • Rust 1.const fn中支持46个控制流和循环。
bxjv4tth

bxjv4tth4#

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

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

此外,如果你非常担心Vec的长度为三个单词,并且在创建后不需要调整存储大小,你可以显式地放弃内部容量,并将values在堆栈上减少到两个单词:

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

相关问题