2013-07-27 16 views
14

Mi chiedo quali siano le differenze tra un Boost Variant e union tipo di dati in C/C++. So che un union tipo di dati riprende la stessa posizione di memoria e il tipo di dati più grande della regione di memoria occupa la quantità totale di memoria utilizzata ad esempioBoost Variant essenzialmente un'Unione in c/C++?

union space { 
    char CHAR; 
    float FLOAT; 
    int INTEGER; 
}S; 

dovrebbe occupare 4 byte di memoria dal int e float sono la dimensione massima e pari. Esistono analogie e differenze in altri modi tra i tipi di dati Boost Variant e union? So anche che un Variant Boost può assumere qualsiasi tipo di dati e consente tipo di dati "polimorfismo" (correggetemi se sto abusando un argomento parola OOP). Un tipo di dati di unione è quindi anche un tipo di polimorfismo?

risposta

11

variante Boost emula un sindacato, ma non usa un'unione nella sua attuazione. Invece utilizza archiviazione e posizionamento allineati nuovi.

E 'polimorfica, nel senso che se si applica un oggetto visitatore su una variante allora sarà scegliere il sovraccarico giusto per te. Questa selezione deve avvenire in fase di esecuzione, ma il codice oggetto per questo viene srotolato in fase di compilazione. Quindi è abbastanza veloce.

16

La differenza principale è che la variante di Boost sa quale tipo memorizzato in esso, quindi non si può sbagliare o ottenere UB da un uso improprio di una variante allo stesso modo è possibile un sindacato. Ciò consente anche a Variant di prendere tipi non POD (cioè effettivamente utili). Variante ha anche alcuni trucchi extra come permettere ai visitatori e varianti ricorsive.

La migliore guida all'utilizzo dei sindacati è "No, perché è quasi impossibile metterli a frutto senza invocare UB". Questo non si applica a Variant, quindi è molto più raccomandabile.

+3

Che cos'è "UB" e "POD"? – pandoragami

+3

@ user2555139 Comportamento non definito e Plain Old Data (tipi) – Rapptz