3

通常我使用类似的东西

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));

但我不是这个解决方案的忠实粉丝。有更好的方法来做到这一点吗?

4

3 回答 3

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));
于 2013-11-13T11:17:04.280 回答
1

首先,经过多次测试,memcpy大概是最快的复制功能了。

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

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

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

这是可能的,因为标准的第 3.9 节规定:

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

于 2013-11-04T11:36:46.397 回答
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;
}
于 2013-11-04T13:11:23.887 回答