arrays - ¿Cómo asignar matrices en el montón en Rust 1.0?
heap (1)
El problema es que la matriz se pasa a la función
Box::new
como argumento, lo que significa que debe crearse
primero
, lo que significa que debe crearse
en la pila
.
Le está pidiendo al compilador que cree 8 megabytes de datos en la pila: eso es lo que lo desborda.
La solución es no usar una matriz de tamaño fijo, sino una
Vec
.
La forma más simple en que puedo pensar para hacer un
Vec
de 8 millones
10.0
es esta:
fn main() {
const SIZE: usize = 1024 * 1024;
let v = vec![10.0; SIZE];
}
O, si por alguna razón prefieres usar iteradores:
use std::iter::repeat;
fn main() {
const SIZE: usize = 1024 * 1024;
let v: Vec<_> = repeat(10.0).take(SIZE).collect();
}
Esto solo debe realizar una única asignación de montón.
Tenga en cuenta que posteriormente puede tomar un
Vec
y convertirlo en un
Box<[_]>
utilizando el método
into_boxed_slice
.
Ver también:
- Comparación de rendimiento de un Vec y un sector en caja
Ya hay una question para esto, pero está relacionada con Rust 0.13 y la sintaxis parece haber cambiado. De la documentation actual, entendí que crear una matriz en el montón sería algo como esto:
fn main() {
const SIZE: usize = 1024 * 1024;
Box::new([10.0; SIZE]);
}
Pero cuando ejecuto este programa me sale el siguiente error:
thread ''<main>'' has overflowed its stack
¿Qué estoy haciendo mal?