2015-05-14 2 views
10

Es gibt bereits eine question dafür, aber bezogen auf Rust 0.13 und die Syntax scheint sich geändert zu haben. Aus der aktuellen documentation verstand ich, dass auf dem Heap ein Array etwas zu schaffen, so sein würde:Wie können Arrays auf dem Heap in Rust 1.0 zugewiesen werden?

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

Aber wenn ich dieses Programm, das ich die folgende Fehlermeldung aus:

thread '<main>' has overflowed its stack 

Was mache ich falsch ?

Antwort

14

Das Problem ist, daß das Array als ein Argument an die Box::new Funktion übergeben wird, das heißt, es erste erstellt werden muss, das heißt, es auf dem Stapel erstellt werden muss.

Sie bitten den Compiler zu erstellen 8 Megabyte von Daten auf dem Stapel: das ist, was es überläuft.

Die Lösung besteht darin, kein Array fester Größe zu verwenden, sondern eine Vec. Der einfachste Weg, was ich denken kann ein machen Vec von 8 Millionen 10.0 ist dies:

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

Oder, wenn Sie aus irgendeinem Grund lieber Iteratoren verwenden würde:

use std::iter::repeat; 

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

Diese sollte nur Führen Sie eine einzelne Heap-Zuweisung durch.

bearbeiten: Beachten Sie auch, dass Sie später eine Vec nehmen und machen es zu einem Box<[_]> durch die into_boxed_slice Methode.

+1

Beachten Sie, dass es 'Box'-Syntax gibt, die dabei helfen soll, aber es ist jetzt instabil und ich bin mir nicht sicher, ob es die direkte Heap-Platzierung von Arrays unterstützt. –

+2

Sie sollten 'vec! [10.0; 1024 * 1024] '. – BurntSushi5

Verwandte Themen