在没有base_object的情况下提升序列化基类

时间:2012-11-21 16:42:13

标签: c++ memory serialization boost boost-serialization

我正在使用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的屏障。我试过评论序列化代码,它需要&lt; 50MB内存。那么是什么让序列化占据了那么大的记忆?

1 个答案:

答案 0 :(得分:0)

您应该更改代码并通过base_object<>()序列化基类。

来自documentation

  

[...]请注意,这与调用基类的serialize函数不同。这似乎可行,但将绕过用于跟踪对象的某些代码,并注册序列化系统按设计运行所需的基本派生关系和其他簿记。因此,所有序列化成员函数都应该是私有的。

额外的内存消耗可能是由object tracking引起的。 如果跟踪了大量对象,则序列化期间内存消耗会急剧增加。

来自special considerations

  

如果先验地知道没有指针值重复,则可以通过适当地设置对象跟踪类序列化特征来消除与对象跟踪相关联的开销。

如果您不需要对象跟踪,可以使用以下命令禁用它:

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