C++ 对象模型 C++ Object Model
C语言的数据及函数
C语言中,数据和函数是分开声明的。
- 数据
typedef struct point2d
{
float x;
float y;
} Point2d;
- 函数
打印Point2d的数值
void Point2d_print(const Point2d * pd)
{
printf("(%f, %f)", pd->x, pd->y);
}
C++的类
同样实现C语言的功能,C++中可以进行如下定义
class Point2d
{
Point2d(float x, float y):m_x(x), m_y(y){}
print()
{
printf("(%f, %f)", m_x, m_y);
}
private:
float m_x;
float m_y;
};
问题:Point2d从C到C++,内存布局上有啥变化呢?
答案是没有变化。
本例中,C++ 中的数据成员和C中一样,不一样的是C++中多了一个非静态成员函数print,但非静态成员函数与数据成员是分离的,并不占用类的大小。也就是说print函数的调用实际为print(Point2d* pd),就如同C语言的Point2d_print调用。
C++内存布局的额外负担有virtual引起,主要包好虚函数(virtual function)和虚基类(virtual base class)。
C++对象模型
C++中,
类数据成员有两种:静态(static) 和 非静态(nonstatic)
类成员函数有三种:静态函数(static)、非静态函数(nonstatic) 和 虚函数(virtual)
C++对象模型:
- 非静态(nonstatic)数据成员在类内部
- 静态(static)在类外部
- 静态函数(static)和非静态函数(nonstatic)在类外部
- 虚函数(virtual):
a. 每个类产生一堆指向虚函数的指针,放在虚表(virtual table, vtbl)
b. 每个类对象添加一个指向虚表的指针(vptr)。
c. 每个类的type_info(用于支持RTTI)也由虚表指定,一般位于第一个slot处。
class Point2d
{
Point2d(float x, float y):m_x(x), m_y(y),m_pointCount(2){}
virtual ~Point2d(){}
static int getPointCount(){return m_pointCount;}
print()
{
printf("(%f, %f)", m_x, m_y);
}
private:
float m_x;
float m_y;
static int m_pointCount;
};
上述代码的C++对象模型如下
扫描二维码关注公众号,回复:
16301235 查看本文章
+---------------+
| float m_x; | virtual table
+---------------+
| float m_y; | +---------------+
+---------------+ | | +--------------------+
| vptr Point2d +----------> +------> type_info(RTTI |
+---------------+ +---------------+ +--------------------+
| | +--------------------+
Point2d pt2; | +------> Point2d::~Point2d()|
+---------------+ +--------------------+
+-------------------------------------+ +------------------------------------+
| static int Point2d::m_pointCount | | Point2d::Point2d(float x, float y) |
+-------------------------------------+ +------------------------------------+
+-------------------------------------+ +------------------------------------+
| static int Point2d::getPointCount() | | Point2d::print() |
+-------------------------------------+ +------------------------------------+
Reference:
- 深度探索C++对象模型