2016-11-01 2 views
2

Следующая действительна Ржавчина:Как Rust хранит значения enum в массивах?

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

Как Rust магазин это? Первый элемент - 12 байтов, а второй - 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 имеет уникальный размер.


Как правило, вы можете избежать хранения очень большого варианта. Одно решение, если один вариант намного больше, чем другой, заключается в достижении Box.