2016-11-01 8 views
2

次は、有効な錆です:Rustはどのように列挙型の値を配列に格納しますか?

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 }]; 
} 

どのように錆がこれを保管していますか?最初の要素は12バイトで、2番目の要素は8です(これに加えて、私が推測する最初のタグバイトを加えます)。配列内の要素への参照のみを格納しますか?

+2

他の場所で列挙型の値を格納するのと同じ方法で、FWIW。 – Shepmaster

答えて

5

エニュウムのすべての変種は、同じ量のメモリを使用します(少なくとも私のマシンではFooタイプの場合は16バイトです)。列挙型の値のサイズは、最大のバリアント(例ではOne)によって決まります。

したがって、値は直接配列に格納できます。

+0

ちょうどそれを見上げて、これは正しいです、ありがとう! –

4

錆はシステムプログラミング言語であり、あなたはそれを聞くことができます!

use std::mem; 

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

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

このprints 16が遊び場にあります。

そして、私がOneまたはTwoについて話し合ったかどうかは、問題ではないので、指定しなかったことに注意してください。 Fooにはユニークなサイズがあります。


大まかには、非常に大きなバリアントの保存を避けることができます。 1つのソリューションが、1つのバリアントが他のバリアントよりもはるかに大きい場合は、Boxに連絡してください。

関連する問題