2017-10-16 76 views
3

我使用boost :: variant进行存储,一个可能的数据成员是一个大型结构。所以二进制变体的大小至少是这个结构大小。在我的情况下,所有其他成员都非常小​​,如int或double。 为了避免基本的大布局,有没有办法强制boost :: variant将项目存储为指针? 当然,我可以使用智能指针来保存的500个字节强制变量存储指针

这个大结构,但在这种情况下,得到了Methode也将工作作为指针访问..这是不是很好

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

尺寸或者其他小的解决方案,但每个接入具有处理指针

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

的sizeof 40个字节

+0

因此,你要在哪里存储'large_struct',以便它不会占用相同的500字节内存? –

回答

3

是的,你可以声明为可变蚂蚁作为

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

递归包装纸通常被用于该large_struct是在所声明的变体时的不完全类型的情况。例如,如果此变体需要成为large_struct的成员,该怎么办?

recursive_wrapper<T>在内部只是一个指针T*,但该变体知道这个指针并透明地为您提供它的引用。这是为了当它需要成为一个指针的事实是一个“细节”,你不希望用户不得不考虑。

它适用于您的使用情况。使用recursive_wrapper<large_struct>而不是large_struct会使large_struct实例处于堆上,但它提供的界面和用法与没有递归包装时完全相同。

+0

作品完美!谢谢 – Markus