这已经有了一个question,但与Rust 0.13有关,语法似乎已经改变.从目前的documentation中,我了解到在堆上创建数组应该是这样的:
fn main() {
const SIZE: usize = 1024 * 1024;
Box::new([10.0; SIZE]);
}
但是当我运行这个程序时,我得到了以下错误:
thread '<main>' has overflowed its stack
我做错了什么?
这已经有了一个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<[_]>
.
另见: