部分原始旧数据

时间:2013-03-17 16:17:14

标签: c++ pod

很多关于POD的问题;但所有问题都谈到了完整的对象复制。我可以在类的普通旧数据部分应用相同的概念。示例:

struct Parent1
{
    int x;
    float y;
};

struct Parent2
{
    int k;
    float l;
};

struct NotPod : public Parent1, public Parent2
{
    char z;
    short w;
};

NotPod a, b;

void func()
{
    a.z = '4';
    a.w = 345;
    memcpy((char*)&b.z, (char*)&a.z, (char*)(&a.w)-(&a.z) + sizeof(a.w));
}

我问的是旧的c ++(不是C ++ 11)。

3 个答案:

答案 0 :(得分:2)

据我从您的示例代码中了解,您的问题与POD无关。您需要的是保证最派生类的成员是聚合并且它们具有连续的内存布局。

见9.2.12(ISO 14882:2003)

  

分配没有插入访问说明符的(非联合)类的非静态数据成员   以便后面的成员在类对象中有更高的地址。非静态分配的顺序   由access-specifier分隔的数据成员未指定(11.1)。

简单来说,不要在您的聚合序列之间添加public / protected / private访问说明符,您将获得这样的保证。

答案 1 :(得分:0)

因此,您只想复制struct中Parent部分的成员。 如果是,为什么不在func3()中实现?

void func2()
{
    a.z = '7';
    a.w = 444;
    a.x = 4;
    a.y = 2.1;
    memcpy(&b, &a, sizeof(NotPod)); // copies all the members
}

void func3()
{  
    a.z = '7';
    a.w = 444;
    a.x = 4;
    a.y = 2.1;
    memcpy(&b, &a, sizeof(Parent)); // copies only the members of the Parent
}

答案 2 :(得分:0)

正如你自己说的那样,它不是C ++中的POD 03。部分内容是(Parent1和Parent2),但您希望将其余部分视为POD。好吧,剩下的就是POD。通过定义本地结构

struct NotPod : public Parent1, public Parent2
{
    struct InternalPod
    {
       char z;
       short w;
    };
    InternalPod i; 
};

或继承自第三个结构:

struct InternalPod
{
   char z;
   short w;
};

struct NotPod : public Parent1, public Parent2, public InternalPod
{
};