2015-05-14 11 views
10

Istnieje już question dla tego, ale związane z Rust 0.13 i wydaje się, że składnia została zmieniona. Od bieżącego documentation Zrozumiałem, że tworząc tablicę na stercie byłoby coś takiego:Jak alokować tablice na stercie w Rust 1.0?

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

Ale kiedy uruchomić ten program, pojawia się następujący błąd:

thread '<main>' has overflowed its stack 

Co robię źle ?

Odpowiedz

14

Problemem jest to, że matryca jest przekazywane do funkcji Box::new jako argumentu, co oznacza, że ​​musi być utworzony pierwszy, co oznacza, że ​​musi być utworzony na stosie.

Pytasz kompilator, aby utworzyć 8 megabajtów danych na stosie: to go przepełnia.

Rozwiązaniem jest nie używanie w ogóle tablicy o stałym rozmiarze, ale Vec. Najprostszym sposobem mogę myśleć zrobić Vec z 8.000.000 10.0 to:

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

Lub, jeśli z jakiegoś powodu wolisz używać iteratorów:

use std::iter::repeat; 

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

To tylko powinien wykonać pojedynczą alokację sterty.

Edit: Należy również pamiętać, że można następnie podjąć Vec i przekształcić go w Box<[_]> za pomocą metody into_boxed_slice.

+1

Należy zauważyć, że istnieje składnia 'box', która ma pomóc w tym, ale jest teraz niestabilna i nie jestem pewien, czy obsługuje ona bezpośrednie umieszczanie sterty tablic jeszcze. –

+2

Powinieneś być w stanie użyć 'vec! [10.0; 1024 * 1024] '. – BurntSushi5