C++对象模型 Object Model
- 成员变量
- 非静态成员变量,配置在类对象中。
- 静态成员变量,存放在全局变量区,属于类。
- 成员函数
- 静态和非静态成员函数,存放在代码段,属于类。
- 虚函数
- 每个类产生一堆指向虚函数的指针,放在表格中,称为虚函数表(virtural table, vtbl)。
- 每个类对象安插一个指针,指向虚函数表,称为vptr。
- vptr的设定和重置,由每个类的构造、析构和拷贝赋值运算符自动完成
- 每个类的type_info object(RTTI),也由vtbl指出,存储在表格第一个。
class Test {
};
sizeof(Test) // 空类,占用1个字节
class Test1 {
int a; // 占用4个字节
void Print() {}; // 不占用空间,函数代码存储在代码段
virtual void Print1() {};
virtual void Print2() {}; // 多个虚函数,存储虚函数表地址,只占用4个字节
};
sizeof(Test1) // 占用8个字节
为什么空类占用1个字节
标准禁止对象大小为 0,因为两个不同的对象需要不同的地址表示。
那是被编译器插进去的一个char ,使得这个class的不同实体(object)在内存中配置独一无二的地址。
也就是说这个char是用来标识类的不同对象。
实际上,这是类结构体实例化的原因,空的类或结构体同样可以被实例化,如果定义对空的类或者结构体取sizeof()的值为0,那么该空的类或结构体实例化出很多实例时,在内存地址上就不能区分该类实例化出的实例,所以,为了实现每个实例在内存中都有一个独一无二的地址,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址,所以空类所占的内存大小是1个字节。