gpt4 book ai didi

c++ - CopyMemory 非 POD

转载 作者:行者123 更新时间:2023-11-28 03:33:24 27 4
gpt4 key购买 nike

我有如下结构和 vector :

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 vector 可以很容易地展平,因为它的元素是 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 vector 将更难展平,因为 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++ - CopyMemory 非 POD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11909286/

27 4 0
文章推荐: C++ vector 不更新
文章推荐: HTML5 元标记和 W3 验证器
文章推荐: C++:实现智能指针
文章推荐: c++ - 在类中制作过滤器
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com