2017-10-16 24 views
3

J'utilise boost :: variant pour le stockage et un membre de données possible est une grande structure. Donc, la taille de la variante binaire est au moins cette taille de structure. Tous les autres membres sont très petits comme int ou double dans mon cas. Pour éviter la mise en page de base, y at-il un moyen de forcer boost :: variant à stocker l'élément comme pointeur? Bien sûr, je pourrais utiliser un pointeur intelligent pour stocker ce grand struct mais dans ce cas, le get Methode fonctionne également comme un accès pointeur .. ce n'est pas si gentilVariation de boost de force pour stocker le pointeur

 boost::variant<int,double,large_struct>> 

taille de 500 octets

ou l'autre petite solution, mais chaque accès doit traiter avec le pointeur

 boost::variant<int,double,shared_ptr<large_struct> 

sIZEOF 40 Octets

+0

alors où allez-vous stocker votre 'large_struct' afin qu'il n'occupe pas les mêmes 500 octets de mémoire? –

Répondre

3

Oui, vous pouvez déclarer la vari ant que

boost::variant<int,double,boost::recursive_wrapper <large_struct>>> 

emballage récursive est normalement utilisé pour le cas où large_struct est un type incomplet au moment où vous déclarez la variante. Par exemple, que faire si cette variante doit être membre de large_struct.

recursive_wrapper<T> est interne juste un pointeur T*, mais la variante est au courant de ce pointeur et de façon transparente pour vous déréférence. C'est pour quand le fait qu'il doit être un pointeur est un "détail" que vous ne voulez pas que l'utilisateur doit penser.

Cela fonctionne parfaitement pour votre cas d'utilisation. L'utilisation de recursive_wrapper<large_struct> au lieu de large_struct fait vivre l'instance large_struct sur le tas, mais donne exactement la même interface et la même utilisation que s'il n'y avait pas de wrapper récursif.

+0

fonctionne parfaitement! Je vous remercie – Markus