我有一些 C++ 代码,我们用它来序列化任意数据并将其存储为一种特殊的图像格式作为元数据。
无论如何,它把它当作一个无效*。我可以做一个简单的memcpy吗?还是有更好的方法来做到这一点?
STL 字符串可能不会将数据存储在连续的内存块中。使用 c_str() 方法从中获取 c 风格的字符串并对其进行序列化。由于 vector 以连续的方式存储其数据,因此您可以直接对其进行序列化。
对于 std::string 您可以使用 c_str() 来获取指向内部字符串的 char* 。
对于 std::vector,标准规定元素在内存中是连续的,因此您可以将指向数据开头的指针作为 &v[0] 访问。
您当然应该小心这些,因为您基本上是在使用指向对象内部数据的指针来处理库。如果需要,您可以使用 memcpy 使用上述作为 src 指针来制作数据的副本,但显然您需要注意使用正确的大小。在不知道函数的详细信息的情况下,您将此数据传递给我们无法评论是否需要此类复制。
正如其他人指出的那样, &v[0] 为您提供了一个指向向量内数组的指针。
但是,请注意,使用 memcpy 序列化数据通常在 C++ 中根本不可移植。数据必须是 Plain-Old-Data 类型(即没有重要的构造函数、虚函数、用户定义的析构函数等),但即便如此,除非您将其读回完全相同,否则您也不应该期望得到正确的行为程序。
更改目标平台、编译器甚至编译器设置都可以改变数据的格式。例如,编译器被允许并且通常会在结构中添加填充字段。
如果你需要的话,有一些很好的库可以让你序列化复杂的数据,比如Boost Serialization 。它已经内置了对 std::vector 和其他标准类型的支持。
STL Vector 将其元素存储在连续内存中,因此您可以使用 memcopy 来复制知道元素大小和数量的元素。