CopyMemory Non-POD
CopyMemory Non-POD
本文关键字:Non-POD CopyMemory 更新时间:2023-10-16
我有看起来像这样的结构和向量:
typedef struct
{
int SX, SY;
int X, Y, Z;
std::vector<Vector3D> Vertices;
const void* VBOPointer;
} Model;
typedef struct
{
int X, Y;
struct
{
int VX[4], VY[4];
int TX[4], VY[4];
} Quad;
} Item;
std::vector<Item> ListOfItems;
std::vector<Model> ListOfModels;
我需要将它们复制到内存中,以便我可以从另一个程序重建它们。我已经映射了内存,但后来我意识到我不能在其中任何一个上使用CopyMemory或MemCpy。
如何复制它?
如何复制标准数据类型/结构的示例:
struct
{
int X;
int Y;
} POD;
//pData is a void pointer to mapped memory given to be by MapFileView..
POD Foo = {100, 50};
long double* Data = static_cast<long double*>(pData);
//Check if Data[1] contains a request command then copy.
CopyMemory(&Data[0], &Foo, sizeof(Foo));
由于您必须处理非 POD 数据,因此您需要将结构数据平展为序列化格式,然后其他应用程序可以将其解析回其末端的结构。
您的ListOfItems
向量可以很容易地展平,因为它的元素是 POD 数据。 将vector
大小存储为整数,将其复制到缓冲区中,然后复制每个Item
(假设缓冲区足够大以容纳平展数据):
long double* Data = static_cast<long double*>(pData);
//Check if Data[1] contains a request command then copy.
unsigned char *Work = static_cast<unsigned char *>(pData);
int number = ListOfItems.size();
CopyMemory(Work, &number, sizeof(int));
Work += sizeof(int);
for (int i = 0; i < number; ++i)
{
CopyMemory(Work, &ListOfItems[i], sizeof(Item));
Work += sizeof(Item);
}
您的ListOfModels
向量将更难展平,因为Model
其中包含另一个vector
,但相同的概念通常适用:
long double* Data = static_cast<long double*>(pData);
//Check if Data[1] contains a request command then copy.
unsigned char *Work = static_cast<unsigned char *>(pData);
int number = ListOfModels.size();
CopyMemory(Work, &number, sizeof(int));
Work += sizeof(int);
for (int i = 0; i < number; ++i)
{
Model &m = ListOfModels[i];
CopyMemory(Work, &(m.SX), sizeof(int) * 5);
Work += (sizeof(int) * 5);
int num = m.Vertices.size();
CopyMemory(Work, &num, sizeof(int));
Work += sizeof(int);
for (int j = 0; j < num; ++j)
{
Vector3D &v = m.Vertices[j];
// copy v as needed...
Work += ...;
}
// copy m.VBOPointer as needed ...
Work += ...;
}
对于这样的事情,我通常做的是使用模板来帮助简化逻辑并使其更易于阅读:
template<typename T>
void Copy(unsignd char* &Work, const T &value)
{
CopyMemory(Work, &value, sizeof(T));
}
template<template T>
void Copy(unsigned char* &Work, const std::vector<T> &vec)
{
int number = vec.size();
Copy(Work, number);
for (int i = 0; i < number; ++i)
Copy(Work, vec[i]);
}
.
long double* Data = static_cast<long double*>(pData);
//Check if Data[1] contains a request command then copy.
unsigned char *Work = static_cast<unsigned char *>(pData);
Copy(Work, ListOfItems);
.
template<>
void Copy<Vector3D>(unsigned char* &Work, const Vector3D &vec)
{
// copy vec as needed...
Work += ...;
}
template<>
void Copy<Model>(unsigned char* &Work, const Model &m)
{
Copy(Work, m.SX);
Copy(Work, m.SY);
Copy(Work, m.X);
Copy(Work, m.Y);
Copy(Work, m.Z);
Copy(Work, m.Vertices);
// copy m.VBOPointer as needed ...
Work += ...;
}
long double* Data = static_cast<long double*>(pData);
//Check if Data[1] contains a request command then copy.
unsigned char *Work = static_cast<unsigned char *>(pData);
Copy(Work, ListOfModels);
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 如何在 malloc 内存中初始化非 POD 数据
- 使用 std::index_sequence 初始化具有固定大小数组成员的 POD 结构容器
- WinSock Non-Blocking I/O
- 收到错误"invalid use of non-static data member 'stu::n' "
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- Qt5 远程对象 + 自定义类型,但不在 POD 中
- 带有 char[] 字段的 POD 结构的 constexpr 构造
- 非 POD 的零初始化
- 具有std::initializer_list参数的非成员函数(/non构造函数上下文)的重载解析
- C++ "Invalid use of 'this' in non-member function" ,
- 当初始值设定项是基类名时'initializer does not name a non-static data member or base class'错误
- C++定义构造函数使对象成为非 POD
- 是否可以使用 std::array 作为 POD 结构的数据容器?
- "Non-pointer POD"键入C++
- C++编译器错误"cannot be thread-local because it has non-POD type""
- CopyMemory Non-POD
- C++ snprintf "cannot pass objects of non-POD type"