Il compilatore non è molto intelligente quando si tratta di ottimizzare il layout di enum
s per lo spazio. Dato:
enum Option<T> { None, Some(T) }
enum Weird<T> { Nil, NotNil { x: int, y: T } }
enum Foo { A, B, C }
c'è davvero solo caso il compilatore considera:
Un Option
-come enum: variante uno trasporta dati ("nullaria"), una variante contenente esattamente un dato. Se utilizzato con un puntatore noto per non essere mai nullo (attualmente, solo riferimenti e Box<T>
) la rappresentazione sarà quella di un singolo puntatore, null che indica la variante nulla. Come caso speciale, lo Weird
riceverà lo stesso trattamento, ma il valore del campo verrà utilizzato per determinare quale variante rappresenta il valore.
Oltre a questo, sono disponibili molte, molte ottimizzazioni possibili, ma il compilatore non le esegue ancora. In particolare, il tuo caso sarà non rappresentato come un singolo byte. Per un singolo enum, non considerando il caso annidato, lo sarà rappresentato come il più piccolo numero intero possibile da.
fonte
2014-06-22 22:56:29
Il rustc conosce certamente le dimensioni delle varianti enum. In effetti, c'è un [lint] (https://github.com/rust-lang/rust/pull/14300) che avverte quando una variante è molto più grande di altre. Ma non so se l'opzione nella tua domanda sarà ottimizzata su un byte o meno. –
edwardw
Molto probabilmente è ottimizzato per puntatori come "Opzione <~T>". –
[# 14540] (https://github.com/rust-lang/rust/issues/14540) è stato archiviato poco fa sull'aggiunta di questa ottimizzazione al compilatore (poiché è consentita dal linguaggio perfettamente). – huon