C++对象模型分析
- class是一种特殊的struct
- 在内存中class依旧可以看作变量的集合
- class与struct遵循相同的内存对齐规则
- class中的成员函数与成员变量是分开存放的
- 每个对象有独立的成员变量
- 所有对象共享类中的成员函数
#include <iostream>
using namespace std;
class A
{
int i;
int j;
char c;
double d;
};
struct B
{
int i;
int j;
char c;
double d;
};
int main(int argc, char const *argv[])
{
B s;
cout<<"sizeof(B) = "<<sizeof(B)<<endl;
cout<<"sizeof(A) = "<<sizeof(A)<<endl;
cout<<"sizeof(int) = "<<sizeof(int)<<endl;
cout<<"sizeof(char) = "<<sizeof(char)<<endl;
cout<<"sizeof(double) = "<<sizeof(double)<<endl;
return 0;
}
- 运行时的对象退化为结构体的形式
- 所有成员变量在内存中依次排布
- 成员变量间可能存在内存空隙
- 可以通过内存地址直接访问成员变量
- 访问权限关键字在运行时失效
- 类中的成员函数位于代码段中
- 调用成员函数时对象地址作为参数隐式传递
- 成员函数通过对象地址访问成员变量
- C++语法规则隐藏了对象地址的传递过程
小结
- C++中的类对象在内存布局上与结构体相同
- 成员变量和成员函数在内存中分开存放
- 访问权限关键字在运行时失效
- 调用成员函数时对象地址作为参数隐式传递
继承对象模型
- 在C++编译器的内部类可以理解为结构体
- 子类是由父类成员叠加子类新成员得到的
#include <iostream>
using namespace std;
class Demo
{
public:
int a;
int b;
};
class Derived:public Demo
{
int c;
public:
Derived(int a,int b,int c)
{
this->a = a;
this->b = b;
this->c = c;
}
void print()
{
cout<<"a = "<<a<<" , "
<<"b = "<<b<<" , "
<<"c = "<<c<<endl;
}
};
int main(int argc, char const *argv[])
{
cout<<"sizeof(Demo) = "<<sizeof(Demo)<<endl;
cout<<"sizeof(Derived) = "<<sizeof(Derived)<<endl;
Derived D(1,2,3);
D.print();
return 0;
}
多态对象模型
- C++多态的实现原理
- 当类中声明虚函数时,编译器会在类中生成一个虚函数表
- 虚函数表是一个存储成员函数地址的数据结构
- 虚函数表是由编译器自动生成与维护的
- virtual成员函数会被编译器放入虚函数表中
- 存在虚函数时,每个对象中都有一个指向虚函数表的指针
小结
- 继承的本质就是父子间成员变量的叠加
- C++中的多态是通过虚函数表实现的
- 虚函数表是由编译器自动生成与维护的
- 虚函数的调用效率低于普通成员函数