通常我使用类似的东西
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));
但我不是这个解决方案的忠实粉丝。有更好的方法来做到这一点吗?
通常我使用类似的东西
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));
但我不是这个解决方案的忠实粉丝。有更好的方法来做到这一点吗?
您可以编写一对辅助函数来隐藏丑陋的强制转换和指针算术:
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));
首先,经过多次测试,memcpy
大概是最快的复制功能了。
其次,您可以将其用于单个项目:
rawData = *reinterpret_cast<POD*>(&PODVec[0]);
它将字节数组地址重新解释为 POD 的对象,并使用类的赋值运算符分配给它。
这是可能的,因为标准的第 3.9 节规定:
对于普通可复制类型 T 的任何对象(基类子对象除外),无论该对象是否拥有类型 T 的有效值,构成该对象的底层字节都可以复制到 char 或 unsigned char 数组中。如果 char 或 unsigned char 数组的内容被复制回对象,则该对象随后应保持其原始值。
步骤 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;
}