如何分配一个非常大的数组



因为我要处理的环境有一定的内存限制,所以我需要在程序执行开始时分配一个非常大的静态大小的数组:

let mut data: [Foo; 1024] = ?

我如何用";"空";数据

我尝试过使用default方法,因为Foo也有一个默认值:

let mut data: [Foo; 1024] = Default::default(),

但它不起作用,因为array只实现了一组固定大小的默认值:

error[E0277]: the trait bound `[foo::Foo; 1024]: std::default::Default` is not satisfied
--> /src/foo.rs:143:22
|
143 |           = Default::default(),
|                      ^^^^^^^^^^^^^^^^ the trait `std::default::Default` is not implemented for `[foo::Foo; 1024]`
|
= help: the following other types implement trait `std::default::Default`:
&[T]
&mut [T]
[T; 0]
[T; 10]
[T; 11]
[T; 12]
[T; 13]
[T; 14]
and 27 others

如何在不在代码中键入巨大的文字的情况下初始化如此大的静态大小的数组?

要多次重复数组中的某些数据,我们使用[{data}; {times}]。所以你需要这个:

let mut data = [Foo::default(); 1024];

这里的注释是不必要的,因为我们在变量的值中指定了类型和长度。

多亏了MaybeUninit的文档,我们可以提供自己的方法来初始化这个数组。

显然,只有当您不希望Foo实现Copy时,这才有用,否则将应用琐碎的常用表示法([value; repeat]((但可能不会问这个问题;^(

use std::mem::MaybeUninit;
struct Foo {
a: u8,
b: u8,
}
fn main() {
let data: [Foo; 1024] = {
let mut data: [MaybeUninit<Foo>; 1024] =
unsafe { MaybeUninit::uninit().assume_init() };
for f in data.iter_mut() {
f.write(Foo { a: u8::MAX, b: 0 });
}
unsafe { std::mem::transmute(data) }
};
for f in data.iter() {
assert_eq!(f.a, u8::MAX);
assert_eq!(f.b, 0);
}
}

最新更新