这已经有了一个question,但与Rust 0.13有关,语法似乎已经改变.从目前的documentation中,我了解到在堆上创建数组应该是这样的:

fn main() {
    const SIZE: usize = 1024 * 1024;
    Box::new([10.0; SIZE]);
}

但是当我运行这个程序时,我得到了以下错误:

thread '<main>' has overflowed its stack

我做错了什么?

推荐答案

问题是数组作为参数传递给Box::new函数,这意味着它必须被创建first,这意味着它必须被创建on the stack.

您要求编译器在堆栈上创建8 megabytes个数据:这就是溢出的数据.

解决方案是根本不使用固定大小的数组,而是使用Vec.我能想到的最简单的方法是,从800万10.0中获得Vec万:

fn main() {
    const SIZE: usize = 1024 * 1024;
    let v = vec![10.0; SIZE];
}

或者,如果出于某种原因,您更愿意使用迭代器:

use std::iter::repeat;

fn main() {
    const SIZE: usize = 1024 * 1024;
    let v: Vec<_> = repeat(10.0).take(SIZE).collect();
}

should只执行一次堆分配.

请注意,随后可以使用into_boxed_slice方法将Vec转换为Box<[_]>.

另见:

Rust相关问答推荐

我如何在Rust中使用传递依赖中的特征?

在特征中使用Async时,如何解决不透明类型`impl Future<;out=self>;`不满足其关联的类型边界和警告?

有没有办法避免在While循环中多次borrow `*分支`

如何正确地将App handler传递给Tauri中的其他模块?

如何点击()迭代器?

将PathBuf转换为字符串

S在Cargo.toml中添加工作空间开发依赖关系的正确方法是什么?

为什么基于高山Linux的Docker镜像不能在绝对路径下找到要执行的命令?

期望一个具有固定大小 x 元素的数组,找到一个具有 y 元素的数组

Rust 中的静态引用

在 Rust 中,在第一个空格上分割字符串一次

如何限制 GtkColumnView 行数

在描述棋盘时如何最好地使用特征与枚举

str 和 String 的 Rust 生命周期

打印 `format_args!` 时borrow 时临时值丢失

在 Rust 中,为什么整数溢出有时会导致编译错误或运行时错误?

为什么 Rust 允许写入不可变的 RwLock?

通用函数中的生命周期扣除和borrow (通用测试需要)

你能用 Rust 和 winapi 制作 Windows 桌面应用程序吗?

如何将 while 循环内的用户输入添加到 Rust 中的向量?