0

如果我们有以下代码:

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

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

换句话说,我能保证:

Derived1 obj;

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

编辑:我的问题是'内存布局是否包含在某些标准中?或者它依赖于编译器?该代码仅用于说明。

4

2 回答 2

1

您的问题的答案是:它们在某些情况下依赖于编译器,而不是在其他情况下。 内的详细信息

如果您需要从类中提取数据,并将其压缩为最小格式,我建议为它们实现一组序列化/反序列化方法。如果您只是想弄清楚 c++ 做了什么,那么链接的问题应该会有很大帮助。

于 2013-02-10T15:37:08.990 回答
0

这样会更安全

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

unsigned* unsafe_internal_a = (unsigned*)((char *)(&obj) + off);
于 2013-02-10T15:02:45.987 回答