考虑下面的示例代码。
- 标准是否定义
b
和d
是否应具有相同的存储大小?它是否定义它们应该而不是具有相同的大小(由于需要一些额外的存储( - 如果标准没有明确规定任何内容,那么实际的编译器通常会对
b
和d
使用相同的大小吗?这取决于课程的内容吗?可能的例外情况有哪些?(编译器和/或特定声明/定义(
。
class base {
// Any possible list of data members (static, inline, etc.) and
// methods (virtual, pure virtual, inline, non-virtual, etc.)
};
class derived : public base {
public:
// Only new methods (whatever... constructors, overrides, etc.),
// no new data members
};
base b;
derived d;
AFAIK,该标准对类实例的大小没有任何保证。
在常见的实现中,类实例的每个非静态数据成员都有内存+指向其类vTable的指针。vTable不是由标准定义的,只是一个实现细节。它通常包含类中定义的虚拟方法的地址,以及所有基类vTables的版本及其虚拟方法的实际实现。它还包含类的实时类型信息。
这意味着,在大多数常见的实现中,没有向基类添加成员的子类的实体应该与该基类的实例具有相同的大小。但是,由于它只是一个未记录的实现细节,所以您应该而不是依赖它。
顺便说一句,我甚至不确定所有常见的实现是只有一个指向vTable的指针,还是指向类vTable和所有基类的不同指针。