指针算法对继承对象的安全性

时间:2013-02-10 14:55:06

标签: c++ memory standards

如果我们有以下代码:

struct Base
{
    int x;
    int y;
    void foo();
    virtual unsigned getCrc() = 0;
};

struct Derived1 : public Base
{
    int a;
    int b;
    unsigned getCrc();
};

struct Derived2 : public Base
{
    float a;
    float b;
    unsigned getCrc();
};

ab应该在内存中xy之后是C ++标准吗? 或者它是最常用的布局继承对象的方法? (即编译器事实标准)。

换句话说,我可以保证:

Derived1 obj;

    int* unsafe_internal_a = (int*)((unsigned)(&obj) + sizeof(Base));

编辑:我的问题是'某些标准是否涵盖了内存布局?或者它依赖于编译器?'。该代码仅供参考。

2 个答案:

答案 0 :(得分:1)

您的问题的答案是:它们在某些情况下依赖于编译器,而在其他情况下则不依赖于编译器。 Details within

如果您需要从类中提取数据并将其压缩为最小格式,我建议为它们实现一组serialize/deserialize methods。如果您只想弄清楚c ++的作用,那么链接的问题应该会有很大的帮助。

答案 1 :(得分:0)

这会更安全

size_t off = offsetof( Derived1, a );
Derived1 obj;

unsigned* unsafe_internal_a = (unsigned*)((char *)(&obj) + off);