簡體   English   中英

CopyMemory Non-POD

[英]CopyMemory Non-POD

我有結構和矢量看起來像:

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

由於Model包含另一個vector ,因此ListOfModels向量將更難以展平,但同樣的概念通常適用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM