Box::new
函数中,这意味着必须先创建它,这意味着它必须在堆栈上创建。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();
}
这个操作应该只进行一次堆内存分配。
请注意,您可以随后使用into_boxed_slice
方法将一个Vec
转换为Box<[_]>
。
另请参阅:
接受的答案非常不令人满意,因为有时我们确实希望在堆上分配数组以保留类型级别的大小信息。使用常量泛型可以稍微改进Johannes的答案。我们可以使用以下函数来代替宏:
fn vec_to_boxed_array<T: Copy, const N: usize>(val: T) -> Box<[T; N]> {
let boxed_slice = vec![val; N].into_boxed_slice();
let ptr = Box::into_raw(boxed_slice) as *mut [T; N];
unsafe { Box::from_raw(ptr) }
}
/// A macro similar to `vec![$elem; $size]` which returns a boxed array.
///
/// ```rustc
/// let _: Box<[u8; 1024]> = box_array![0; 1024];
/// ```
macro_rules! box_array {
($val:expr ; $len:expr) => {{
// Use a generic function so that the pointer cast remains type-safe
fn vec_to_boxed_array<T>(vec: Vec<T>) -> Box<[T; $len]> {
let boxed_slice = vec.into_boxed_slice();
let ptr = ::std::boxed::Box::into_raw(boxed_slice) as *mut [T; $len];
unsafe { Box::from_raw(ptr) }
}
vec_to_boxed_array(vec![$val; $len])
}};
}
box
的语法,它应该有助于解决这个问题,但它目前还不稳定,我不确定它是否支持直接将数组放置在堆上。 - Vladimir Matveevvec![10.0; 1024 * 1024]
。 - BurntSushi5