2017-10-16 12 views
3

私は記憶域にboost :: variantを使用し、1つの可能なデータメンバーは大きな構造体です。したがって、バイナリバリアントのサイズは少なくともこの構造体サイズです。他のすべてのメンバーは私の場合intまたはdoubleのように非常に小さいです。 基本的な大きなレイアウトを避けるには、boost :: variantに項目をポインタとして保存させる方法がありますか?もちろん 私は、この大規模な構造体を格納するためのスマートポインタを使用するが、この場合にはMethodeのも、ポインタのアクセスとして働くだろう得ることができます。これは、500バイトポインタをストアするための強制ブーストバリアント

のとても素敵

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

サイズではありませんまたは他の小さなソリューションが、それぞれのアクセスはポインタ

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

はsizeof 40バイトに対処する必要がある

+0

あなたの 'large_struct'はどこに格納されるので、同じ500バイトのメモリを占有しませんか? –

答えて

3

はい、あなたが宣言することができVARIアリは

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

再帰ラッパーとして通常large_structがバリアントを宣言する時に不完全な型である場合に使用されます。たとえば、このバリアントがlarge_structのメンバーである必要がある場合はどうなりますか?

recursive_wrapper<T>は内部的にはポインタT*ですが、このポインタはこのバリアントが認識しており、トランスペアレントに逆参照します。これは、ポインタである必要があるという事実が、ユーザーが考える必要のない「詳細」であるときのためです。

しかし、あなたのユースケースでは完璧に動作します。 large_structの代わりにrecursive_wrapper<large_struct>を使用すると、large_structインスタンスがヒープ上に配置されますが、再帰ラッパーが存在しない場合とまったく同じインターフェイスと使用法が得られます。

+0

は完璧に機能します!ありがとうございました – Markus

関連する問題