nark 序列化与 C++14 的新特性
nark C++ 序列化库 尽管 性能优异,但是C++14以前,在某些情况下想要完全发挥性能优势,需要额外声明 DATA_IO_DUMP_RAW_MEM。
只是因为受制于 C++ 的语法限制,无法实现自动推导所有的 Dumpable 对象——可以 memcpy 的对象:
1 2 3 4 5 6 7 8 |
struct A { int a1, a2; }; struct B { int b1, b2; }; struct C { A ca; B cb; }; struct D { std::set<std::string> d; }; DATA_IO_LOAD_SAVE_E(A, &a1 &a2) // 序列化 A 的 a1, a2 成员,可以 memcpy DATA_IO_LOAD_SAVE_E(B, &b1 &b2) // 同上 DATA_IO_LOAD_SAVE_E(C, &ca &cb) // 可以 memcpy ,但不能自动推导出来 DATA_IO_LOAD_SAVE_E(D, &d) // stl 容器也可以序列化,但不能 memcpy |
如果使用 NativeDataInput/NativeDataOutput, 只能自动推断出 A, B 可以直接 memcpy,无法推断出 C 也可以 memcpy,当然,任何情况下 D 肯定都是无法 memcpy 的。
C++14 有了 return type deduction, struct C memcpy 的问题就解决了,详细内容,请看代码
这其中,发现了 gcc-4.8 的 Bug 59766 – c++1y: declaring friend function with ‘auto’ return …,还好,这个 bug 可以 这样 Workaround。
新版的序列化库仅使用C++11语法就能实现该功能(自动推导所有的 Dumpable 对象)。通过利用 C++11 的 auto func(ArgList) -> Expression 语法,当 func 为成员函数时,Expression 中可以包含数据成员和对成员函数的调用。从而,也就不需要这个 Work Around。