2012-11-21 72 views
0

我正在使用boost序列化的多重繼承。而不是做沒有base_object的boost序列化基類

boost::serialization::base_object< Connection<T> >(*this) 
boost::serialization::base_object< Collection<C> >(*this) 

我做

template<typename ArchiveT> 
void save(ArchiveT& arc, const unsigned version) const{ 
    //both Connection<T> and Collection<C> are Base Classes 
    Connection<T>::save(arc, version); 
    Collection<C>::save(arc, version); 
} 

和工作。那麼他們兩個是同一件事嗎?或者這樣做有什麼傷害?我應該改變這個代碼嗎?

{這件東西很久以前就被編碼了。所以我忘了爲什麼我這樣編碼。可能是我當時不知道base_object}

我正在序列化大量數據(〜1.6 GB)。當我序列化時,我看到序列化過程佔用大量內存並觸及3GB的障礙。我試過評論序列化代碼,它需要100MB內存。那麼爲什麼序列化需要這麼大的內存呢?

回答

0

您應該更改您的代碼並通過base_object<>()序列化基類。

documentation

[...]請注意,這是不一樣的調用基類的序列化功能。這似乎可行,但會繞過某些用於跟蹤對象的代碼,並註冊基礎派生關係以及序列化系統按設計運行所需的其他簿記。出於這個原因,所有序列化成員函數都應該是私有的。

額外的內存消耗可能是由object tracking造成的。 如果您有大量的對象被跟蹤,則在序列化期間內存消耗可能急劇增加。

special considerations來自:

如果先驗已知的,沒有指針值是重複的,與對象跟蹤相關聯的開銷可以通過適當地設定該對象跟蹤類的序列特徵來消除。

如果你不要求目標跟蹤,你可以禁用它:

BOOST_CLASS_TRACKING(the_class, boost::serialization::track_never)