如果我有一个带有基元的类,例如一堆int或chars,是否可以使用memcpy对它进行反序列化和序列化?
MyClass toSerialize;
unsigned char byteDump[sizeof(toSerialize)];
memcpy(&byteDump, &toSerialize, sizeof(toSerialize));
WriteToFile(byteDump);
然后在另一个程序或计算机上,执行以下操作:
MyClass toDeserialize;
unsigned char byteDump[sizeof(toSerialize)];
LoadFile(byteDump);
memcpy(&toDeserialize, &byteDump, sizeof(byteDump));
我在某些情况下实际上可以在同一程序中工作。但是,如果我尝试在其他程序或PC上运行它,则有时它不起作用,并且
MyClass
将具有不同的值。这安全吗? 最佳答案
在不同的程序或平台之间,memcpy
是不安全。您不能保证类型的字节布局是一致的。
在同一平台上的同一程序中,只有 T
为memcpy
,才能将格式良好的*类型is_trivially_copyable_v<T>
序列化为true
。std::atomic
是一种利用某些可按字节复制的类型的类型。
*如果已定义或默认的构造函数,赋值运算符或析构函数中没有错误,则T
类型被视为“格式正确”。