C++ 对象模型 C++ Object Model

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++对象模型:

  1. 非静态(nonstatic)数据成员在类内部
  2. 静态(static)在类外部
  3. 静态函数(static)和非静态函数(nonstatic)在类外部
  4. 虚函数(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:

  1. 深度探索C++对象模型

猜你喜欢

转载自blog.csdn.net/itas109/article/details/132031941