2014-06-22 4 views
5

Supponiamo di avere un enum Foo { A, B, C }.L'opzione <T> è ottimizzata su un singolo byte quando T lo consente?

È un Option<Foo> ottimizzato su un singolo byte in questo caso?

Domanda bonus: se sì, quali sono i limiti del processo di ottimizzazione? Le enumerazioni possono essere annidate e contenere altri tipi. Il compilatore è sempre in grado di calcolare il numero massimo di combinazioni e quindi scegliere la rappresentazione più piccola?

+0

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

+0

Molto probabilmente è ottimizzato per puntatori come "Opzione <~T>". –

+0

[# 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

risposta

3

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.