你能用 memcpy 反序列化字节吗?
Can you deserialize bytes with memcpy?
如果我有一个 class 里面有原语,例如一堆整数或字符,是否可以用 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()
不是为此设计的。话虽如此,如果您不关心跨平台问题,无论是数据还是可执行文件,您都可以摆脱它。
只要一致地存储和检索数据,memcpy()
就不会在意。
Is this safe to do or not?
在不同的程序或平台之间,memcpy
不安全。你不能保证一个类型的字节布局是一致的。
在同一平台上的同一程序中,只有当 is_trivially_copyable_v<T>
是 true
.
std::atomic
是一种利用某些类型可按字节复制的类型。
*如果定义或默认的构造函数、赋值运算符或析构函数中没有错误,则类型 T
被视为 "well formed"。
如果我有一个 class 里面有原语,例如一堆整数或字符,是否可以用 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()
不是为此设计的。话虽如此,如果您不关心跨平台问题,无论是数据还是可执行文件,您都可以摆脱它。
只要一致地存储和检索数据,memcpy()
就不会在意。
Is this safe to do or not?
在不同的程序或平台之间,memcpy
不安全。你不能保证一个类型的字节布局是一致的。
在同一平台上的同一程序中,只有当 is_trivially_copyable_v<T>
是 true
.
std::atomic
是一种利用某些类型可按字节复制的类型。
*如果定义或默认的构造函数、赋值运算符或析构函数中没有错误,则类型 T
被视为 "well formed"。