假设T
是一个不包含指针的POD类型,并且我想序列化T(除了其他一些数据)。我创建了下面的函数来做到这一点:通过直接转换为char数组来序列化POD数据是否安全?
template<class T> void serialize(const T& source, char*& dest)
{
*(T*)dest = source;
dest += sizeof(T);
}
template<class T> void deserialize(T& dest, char*& source)
{
dest = *(T*)source;
source += sizeof(T);
}
这会不会引起任何问题,或者是否有任何编译器在那里,这将不起作用?换句话说,代码:
template<class T> bool check_sanity(const T& obj)
{
std::unique_ptr<char[]> buffer { new int[sizeof(T)] };
serialize(obj, buffer);
T new_obj;
deserialize(new_obj, buffer);
return new_obj == obj;
}
有没有返回假吗? (假设T是POD并且没有人重载==运算符)。
我正在写这些序列化方法与MPI结合使用,他们将在程序开始时使用它来分发簿记所需的一些数据,因此同一个程序将始终是序列化和反序列化数据。
我不知道你是如何打破严格别名规则,因为'T *'到'char *'并返回到'T *'应该是一个有效的..我认为这就是'reinterpret_cast'的原因。 – Brandon