2015-05-14 10 views
10

Esiste già uno question ma correlato a Rust 0.13 e la sintassi sembra essere stata modificata. Dalla corrente documentation ho capito che la creazione di una matrice sul mucchio sarebbe qualcosa di simile a questo:Come allocare gli array sull'heap in Rust 1.0?

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

Ma quando ho eseguito questo programma ottengo il seguente errore:

thread '<main>' has overflowed its stack 

Che cosa sto facendo di sbagliato ?

risposta

14

Il problema è che l'array viene passato alla funzione Box::new come argomento, il che significa che deve essere creato primo, il che significa che deve essere creato in pila.

Stai chiedendo al compilatore di creare 8 megabyte di dati nello stack: ecco cosa lo sta traboccando.

La soluzione è di non utilizzare una matrice di dimensioni fisse, ma uno Vec. Il modo più semplice che posso pensare di fare una Vec di 8 milioni di 10.0 è questo:

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

Oppure, se per qualche motivo si preferisce utilizzare iteratori:

use std::iter::repeat; 

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

Questo solo dovrebbe eseguire una singola allocazione dell'heap.

Edit: Si noti inoltre che è possibile poi prendere un Vec e di trasformarlo in un Box<[_]> utilizzando il metodo into_boxed_slice.

+1

Si noti che esiste la sintassi 'box' che si suppone possa essere d'aiuto ma ora è instabile e non sono sicuro che supporti ancora il posizionamento diretto degli array. –

+2

Dovresti essere in grado di usare 'vec! [10.0; 1024 * 1024] '. – BurntSushi5

Problemi correlati