gpt4 book ai didi

arrays - 如何在 Rust 1.0 中的堆上分配数组?

转载 作者:行者123 更新时间:2023-11-29 08:33:10 26 4
gpt4 key购买 nike

已经有一个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作为参数函数,这意味着它必须首先创建,这意味着它必须在堆栈上创建。

您要求编译器在堆栈上创建 8 兆字节 的数据:这就是它溢出的原因。

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

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();
}

应该只执行一个堆分配。

请注意,您随后可以使用 Vec并将其变成 Box<[_]>通过使用 into_boxed_slice 方法。

另见:

关于arrays - 如何在 Rust 1.0 中的堆上分配数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44432937/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com