2016-11-01 3 views
2

gilt folgendes Rust:Wie speichert Rust Enum-Werte in Arrays?

enum Foo { 
    One(i32, i32, i32), 
    Two { x: i32, y: i32 }, 
} 

fn main() { 
    let x: [Foo; 2] = [Foo::One(1, 2, 3), Foo::Two { x: 1, y: 2 }]; 
} 

Wie funktioniert Rust speichern das? Das erste Element ist 12 Bytes, während das zweite 8 ist (plus ein Tag-Byte am Anfang, denke ich). Werden nur Verweise auf die Elemente im Array gespeichert?

+2

Auf die gleiche Weise speichert es Enum-Werte woanders, FWIW. – Shepmaster

Antwort

5

Alle Varianten eines Enum verwenden die gleiche Menge an Speicher (im Falle Ihres Foo Typ, 16 Bytes, zumindest auf meinem Rechner). Die Größe der Enum-Werte wird durch ihre größte Variante (in Ihrem Beispiel One) bestimmt.

Daher können die Werte direkt im Array gespeichert werden.

+0

Habe einfach nachgeschaut und das stimmt, danke! –

4

Rost ist eine System-Programmiersprache, Sie können es einfach fragen!

use std::mem; 

enum Foo { 
    One(i32, i32, i32), 
    Two { x: i32, y: i32 }, 
} 

fn main() { 
    println!("{}", mem::size_of::<Foo>()); 
} 

Diese prints 16 auf dem Spielplatz.

Und beachten Sie, dass ich nicht angegeben habe, ob ich sprach über One oder Two, weil es egal ist. Foo hat eine einzigartige Größe.


Als Faustregel können Sie vermeiden, eine sehr große Variante zu speichern. Eine Lösung, wenn eine einzelne Variante viel größer ist als die andere, ist es, Box zu erreichen.