如果我有两个类,一个从另一个继承,而子类只包含函数,那么两个类的内存布局是否相同?
例如
class Base {
int a,b,c;
};
class Derived: public Base {
// only functions.
};
我读过编译器不能重新排序数据成员,我不需要Derived
类的多重继承。有没有内存布局不一样的情况?(类可能需要多重继承Base
)
如果我有两个类,一个从另一个继承,而子类只包含函数,那么两个类的内存布局是否相同?
例如
class Base {
int a,b,c;
};
class Derived: public Base {
// only functions.
};
我读过编译器不能重新排序数据成员,我不需要Derived
类的多重继承。有没有内存布局不一样的情况?(类可能需要多重继承Base
)
两者Base
和Derived
这里都是标准布局类。由于标准布局旨在与其他语言(尤其是 C)进行互操作,是的,您可以期望两者的布局相同。但是,如果您将多重继承添加到混合中,则结果可能是也可能不是标准布局类。您可以在上面链接的帖子中查看规则。
布局必须相同,因为您可以通过指向基类的指针访问派生实例。
这意味着即使您添加了数据成员,它们仍然是相同的。
这也意味着即使您使用了多重继承,它也是一样的。
(尽管在这种情况下,您可能需要专门做static_cast
s 来指定您所指的基类的哪个实例,因为派生类指针不必与基类指针相同。)
它因编译器而异,但我认为对于最常见的编译器,您的假设是正确的。g++/gcc 按照您的建议进行某些工作,但我不确定其他工作。
实际上,两个类的布局是相同的,但请注意,如果您将任何虚函数添加到派生类型,那么布局将会改变(或至少可以改变)。
现在,从描述看来,您尝试做的是创建一个类型以在现有类之上提供成员函数,如果是这种情况,您可能应该考虑其他不同的设计,例如使用自由函数(C风格)。
不要指望它。
但是对于一些常见的编译器,内存布局实际上可能是相同的。