正如此link所述,用于定义模板类的特征,我们应该手动定义它,或者从特征类中提取我们的类。但是我想自动制作这个过程,因为这个原因受到BOOST_CLASS_TRACKING
的启发我编写了打击代码:
define FOO_CLASS_TRACKING(E, PARAMETER_TUPLE, ...) \
namespace boost { \
namespace serialization { \
template<BOOST_PP_TUPLE_ENUM(PARAMETER_TUPLE)> \
struct tracking_level< __VA_ARGS__ > \
{ \
typedef mpl::integral_c_tag tag; \
typedef mpl::int_< E> type; \
BOOST_STATIC_CONSTANT( \
int, \
value = tracking_level::type::value \
); \
/* tracking for a class */ \
BOOST_STATIC_ASSERT(( \
mpl::greater< \
/* that is a prmitive */ \
implementation_level< __VA_ARGS__ >, \
mpl::int_<primitive_type> \
>::value \
)); \
}; \
}}
// which used like this
FOO_CLASS_TRACKING(boost::serialization::track_never, (typename Key, typename Value), Foo<Key, Value>)
我在我的代码中使用了这个宏,但现在我不确定这个宏是否会阻止类跟踪。
我有一个大数据结构,我想在序列化过程中消耗更少的内存。通过使用callgrind
检查我的程序,我发现序列化lib中的大多数new()
调用来自文件save_pointer
中名为basic_oarchive.hpp
的函数,该函数存储指向跟踪对象的指针映射,我希望通过将所有类更改为never_track
内存消耗显着降低。但没有发生重大变化。
我的宏有问题吗?或序列化的内存消耗与跟踪对象无关? 有没有办法发现是否设置了类的跟踪特性?
修改
我的项目简介是一个特里,每个节点都是一个抽象类的指针,并有指向其子节点的指针。如果我不禁用指针跟踪,那么所有这些节点都会保存在boost序列化库的映射中,并且在序列化期间内存会乘以2。
更新
我放在这里的宏效果很好。但是对于禁用跟踪,您必须注意到库有许多内部指针跟踪它们。例如,在我的情况下,有许多指向pair<const Key, Value>
的指针,它是许多stl或其他容器的内部指针。通过禁用所有这些内存消耗显着降低。
答案 0 :(得分:1)
OP已经posted the synthetic benchmark确实展示了他想要衡量的东西。
我在Massif下运行了两次:在左边只是构建一个大树,在右边也是序列化它:https://gist.github.com/sehe/5f060a3daccfdff3178c#file-sbs-txt
请注意内存使用情况基本上完全相同:对象跟踪不是问题
为了进行比较,启用跟踪时:https://gist.github.com/8d3e5dba7b124a750b9b
问。 我在代码中使用了这个宏,但现在我不确定这个宏是否会阻止该类跟踪。
是。它显然是。
旧答案的原始脚注:
¹不,它通常不会是内存量的两倍 - 这需要一种非常特定的数据集,具有非常低的有效负载 - 节点大小比率