C++对象模型 Object Model

  • 成员变量
    • 非静态成员变量,配置在类对象中。
    • 静态成员变量,存放在全局变量区,属于类。
  • 成员函数
    • 静态和非静态成员函数,存放在代码段,属于类。
  • 虚函数
    • 每个类产生一堆指向虚函数的指针,放在表格中,称为虚函数表(virtural table, vtbl)。
    • 每个类对象安插一个指针,指向虚函数表,称为vptr。
    • vptr的设定和重置,由每个类的构造、析构和拷贝赋值运算符自动完成
    • 每个类的type_info object(RTTI),也由vtbl指出,存储在表格第一个。
  1. class Test {
  2. };
  3. sizeof(Test) // 空类,占用1个字节
  4. class Test1 {
  5. int a; // 占用4个字节
  6. void Print() {}; // 不占用空间,函数代码存储在代码段
  7. virtual void Print1() {};
  8. virtual void Print2() {}; // 多个虚函数,存储虚函数表地址,只占用4个字节
  9. };
  10. sizeof(Test1) // 占用8个字节

为什么空类占用1个字节

标准禁止对象大小为 0,因为两个不同的对象需要不同的地址表示
那是被编译器插进去的一个char ,使得这个class的不同实体(object)在内存中配置独一无二的地址
也就是说这个char是用来标识类的不同对象
实际上,这是类结构体实例化的原因,空的类或结构体同样可以被实例化,如果定义对空的类或者结构体取sizeof()的值为0,那么该空的类或结构体实例化出很多实例时,在内存地址上就不能区分该类实例化出的实例,所以,为了实现每个实例在内存中都有一个独一无二的地址,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址,所以空类所占的内存大小是1个字节。