通常我正在使用像
这样的东西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));
但我不是这个解决方案的忠实粉丝。有没有更好的方法呢?
答案 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;
}