继承对象上指针算术的安全性

Safety of pointer arithmatic on inherited objects

本文关键字:安全性 指针 对象 继承      更新时间:2023-10-16

如果我们有以下代码:

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

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

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

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

这将是更安全的

size_t off = offsetof( Derived1, a );
Derived1 obj;
unsigned* unsafe_internal_a = (unsigned*)((char *)(&obj) + off);