将POD结构/结构向量复制到向量<unsigned char =“”> </unsigned>的最优雅方法

时间:2013-11-04 11:30:34

标签: c++ serialization stl

通常我正在使用像

这样的东西
copy((uint8_t*)&POD, (uint8_t*)(&POD + 1 ), back_inserter(rawData));

copy((uint8_t*)&PODVec[0], (uint8_t*)(&PODVec[0] + PODVec.size()), back_inserter(rawData));

但我不是这个解决方案的忠实粉丝。有没有更好的方法呢?

3 个答案:

答案 0 :(得分:2)

你可以编写一对辅助函数来隐藏丑陋的演员和指针算术:

template<typename T>
char* object_begin(T& obj)
{
    return
        &const_cast<char&>(
            reinterpret_cast<const volatile char&>(obj)
        );
}

template<typename T>
char* object_end(T& obj)
{
    return object_begin(obj) + sizeof(obj);
}

你会像这样使用它们:

vector<POD> vpod;
vector<unsigned char> vbytes;

copy(object_begin(vpod.front()),
     object_end(vpod.back()),
     back_inserter(vbytes));

答案 1 :(得分:1)

首先,经过多次测试后,memcpy可能是复制功能中最快的。

其次,您可以将这个用于单个项目:

rawData = *reinterpret_cast<POD*>(&PODVec[0]);

它会将字节数组地址重新解释为POD的一个对象,并使用该类的赋值运算符赋值给它。

这是可能的,因为标准的第3.9节陈述:

  

对于任何对象(基类子对象除外)的简单   可复制类型T,无论对象是否包含有效的类型值   T,组成对象的底层字节可以复制到   char或unsigned char数组。如果是数组的内容   char或unsigned char被复制回对象,对象应该   随后保持其原始价值。

答案 2 :(得分:0)

步骤1.将矢量调整为适当大小

步骤2.在处理原始数据时使用memcpy

#include <vector>
#include <string.h>

int main() {

    struct Foo {
        int a;
        double z;
    };

    Foo data[12];
    std::vector<char> rawdata;

    rawdata.resize(sizeof(data));
    memcpy(data, &rawdata[0], sizeof(data));

    return 0;
}