C++ 使用动态大小的元素设置数组的原始数据(向量到/从void*)

C++ 使用动态大小的元素设置数组的原始数据(向量到/从void*),c++,vector,C++,Vector,我需要存储和恢复具有不同大小元素的向量,并希望调整我的解决方案以使其正常工作。目标是获取以字节为单位的数据大小+获取指向数据开头的空指针 我在代码中使用了一个模板类,并在其中结合了解决方案1和2,但为了简单起见,我在这个问题中将代码拆分 1)所有元素大小相同的元素向量的解决方案: 1.1)将向量另存为原始数据-使用固定大小的元素,例如int: 2.1)保存动态元素的向量: 如果vec的元素不都具有相同的大小?我想不会,但我不确定。如果这不是拯救,也许有人有更好的建议?(我知道我可以手动解决这个问

我需要存储和恢复具有不同大小元素的向量,并希望调整我的解决方案以使其正常工作。目标是获取以字节为单位的数据大小+获取指向数据开头的空指针

我在代码中使用了一个模板类,并在其中结合了解决方案1和2,但为了简单起见,我在这个问题中将代码拆分

1)所有元素大小相同的元素向量的解决方案:

1.1)将向量另存为原始数据-使用固定大小的元素,例如int:

2.1)保存动态元素的向量:

如果
vec
的元素不都具有相同的大小?我想不会,但我不确定。如果这不是拯救,也许有人有更好的建议?(我知道我可以手动解决这个问题,只需在2.1中创建一个原始数据,后面是一个大小/元素列表,然后在2.2中逐个解析元素1,并用此数据填充向量,但可能(如案例1)
有一个更简单的解决方案是借助向量?

这吸引了我的眼球:如果
vec
的元素不都具有相同的大小IMHO,那么
std::vector
的所有元素根据定义都具有相同的大小-详细解释为
T
+1,但不提供一个值为-1。细节很重要,所以如果您可以发布一个完整的示例from,那就好了:元素是连续存储的,这意味着不仅可以通过迭代器访问元素,还可以使用指向元素的常规指针的偏移量来访问元素。这意味着指向向量元素的指针可以传递给任何需要指向数组元素的指针的函数(例如,您可能最终在两个不同的对象中持有指向相同数据的指针,因此在双重删除中,许多其他错误情况也可能发生)但是,在一些特定的场景中,它可以是安全的。将任意数据输入/访问数据的原始字节是一种通常被认为是危险的东西。它在同一平台上最适合原始类型。对于便携解决方案来说,即使是原始类型,也可能成为一个问题。一般来说,我会建议。d.概述。
std::vector<int> data;
Sint32 size = sizeof(int) * vec.size();
void* tdata = static_cast<void*>(&vec[0]);
// tdata points to the raw data => I can work with this now and save it to my memory structure (tdata + size is saved there) 
std::vector<int> vec;
size_t size = ...; // received from my memory structure
void* tdata = ...; // received from my memory structure

int count = size / sizeof(int);
vec.resize(count);
memcpy(&vec[0], tdata, size);
// vec contains count elements of type int now
class ObjectWithSize
{
    public:
        // eg. for an int + char*: sizeof(int) + strlen(text) + 1
        virtual int getRawSize() = 0; 
};

class RawDataWithCount
{
    public:
        int count;
        void* data;
};
Sint32 datasize = 0;
for (int i = 0; i < vec.size(); i++) 
    datasize += vec.at(i).getRawSize();
RawDataWithCount data = RawDataWithCount();
data.count = vec.size();
data.data = static_cast<void*>(&vec[0]);
void* tdata = static_cast<void*>(&data);
// tdata points to the raw data => I can work with this now and save it to my memory structure (tdata + datasize is saved there) 
std::vector<T> vec;
size_t size = ...; // received from my memory structure
void* tdata = ...; // received from my memory structure
RawDataWithCount* data = reinterpret_cast<RawDataWithCount*>(tdata);
int count = data->count;
vec.resize(count);
memcpy(&vec[0], data->data, size);
vec.resize(count);
memcpy(&vec[0], data->data, size);