【问题标题】:Converting STL String, and STL Vector into void*?将 STL 字符串和 STL 向量转换为 void*?
【发布时间】:2009-12-05 06:29:53
【问题描述】:

我有一些 C++ 代码,我们用它来序列化任意数据并将其存储为特殊的图像格式作为元数据。

无论如何,它把它当作一个无效*。我可以做一个简单的memcpy吗?或者有更好的方法吗?

【问题讨论】:

    标签: c++ void


    【解决方案1】:

    STL 字符串可能不会将数据存储在连续的内存块中。使用 c_str() 方法从中获取 c 风格的字符串并对其进行序列化。由于vector以连续的方式存储其数据,您可以直接对其进行序列化。

    【讨论】:

    • 序列化向量?希望您的意思是获取第一个元素的地址并序列化数组,对吗? (类似于&v[0])
    • 是的,我的意思是向量的元素
    【解决方案2】:

    对于 std::string 可以使用 c_str() 来获取指向内部字符串的 char*。

    对于 std::vector,标准规定元素在内存中是连续的,因此您可以将指向数据开头的指针作为 &v[0] 访问。

    您当然应该小心这些,因为您基本上是在使用指向对象内部数据的指针传递库。如果需要,您可以使用 memcpy 使用上述作为 src 指针来制作数据的副本,但显然您需要注意使用正确的大小。在不知道您将这些数据传递给的函数的详细信息的情况下,我们无法评论是否需要此类复制。

    【讨论】:

      【解决方案3】:

      正如其他人指出的那样,&v[0] 为您提供了一个指向向量内数组的指针。

      但是,请注意,使用 memcpy 序列化数据通常在 C++ 中根本无法移植。数据必须是 Plain-Old-Data 类型(即没有重要的构造函数、虚函数、用户定义的析构函数等),但即便如此,除非您将其读回完全相同,否则您也不应该期望得到正确的行为程序。

      更改目标平台、编译器甚至编译器设置都可以改变数据的格式。例如,编译器被允许并且通常会在结构中添加填充字段。

      如果你需要的话,有一些很好的库可以让你序列化复杂的数据,比如Boost Serialization。它已经内置了对 std::vector 和其他标准类型的支持。

      【讨论】:

        【解决方案4】:

        STL Vector 将其元素存储在连续内存中,因此您可以使用 memcopy 来复制知道元素大小和数量的元素。

        【讨论】:

        • 只要确保从第一个元素(即 &v[0])复制,而不是从其自身所在的向量对象(即 &v)复制。
        猜你喜欢
        • 2012-01-18
        • 1970-01-01
        • 2013-11-12
        • 1970-01-01
        • 2011-02-06
        • 1970-01-01
        • 1970-01-01
        • 2021-06-22
        • 1970-01-01
        相关资源
        最近更新 更多