首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CopyMemory非POD

CopyMemory非POD
EN

Stack Overflow用户
提问于 2012-08-11 05:08:49
回答 1查看 252关注 0票数 0

我有看起来像这样的结构和向量:

代码语言:javascript
复制
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。

我怎么复制它呢?

我如何复制标准数据类型/结构的示例:

代码语言:javascript
复制
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));
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-11 05:42:59

由于您必须处理非POD数据,因此您需要将结构数据展平为序列化格式,然后其他应用程序可以将其解析回其一端的结构。

您的ListOfItems矢量可以很容易地展平,因为它的元素是POD数据。将vector大小存储为整数,将其复制到缓冲区中,然后复制每个Item (假设缓冲区足够大,可以容纳展平的数据):

代码语言:javascript
复制
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向量将更难扁平化,但相同的概念通常也适用:

代码语言:javascript
复制
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 += ...;
}

对于这样的事情,我通常使用模板来帮助简化逻辑并使其更容易阅读:

代码语言:javascript
复制
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]);
}

代码语言:javascript
复制
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);

代码语言:javascript
复制
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);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11909286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档