内存对齐
对象中的虚函数
虚函数表
对于包含虚函数的类,编译器会在对象的内存布局中添加一个指向虚函数表的指针,称为虚函数指针或 vptr。虚函数表是一个表格,其中包含了类的虚函数的地址。
虚函数调用过程
当调用一个对象的虚函数时,实际上是通过该对象的虚函数指针查找虚函数表,并从表中找到相应的函数地址进行调用。这就是为什么虚函数调用被称为动态绑定,因为它在运行时进行。
包含虚函数的对象大小
class student{
private:
int age;
char* name;
public:
virtual void talk(){
//...
}
};
上面这个student类,包含一个int型的age变量,一个char类型的指针,还有一个指向虚函数表的指针。如果添加一个虚函数
class student{
private:
int age;
char* name;
public:
virtual void talk(){
//...
}
virtual void eat(){
//...
}
};
不会改变这个student类对象在内存中的大小,因为新增的虚函数是在虚函数表中添加的,而对象中保存的依旧只有一个指向虚函数表的指针。