2017-10-16 66 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