建筑效果图网站有哪些电商ui设计是什么意思
C++ 对象模型 C++ Object Model
文章目录
- C++ 对象模型 C++ Object Model
 - C语言的数据及函数
 - C++的类
 - C++对象模型
 
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++对象模型如下
+---------------+
|  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++对象模型
 
