Modelo de objeto C++Modelo de objeto C++

Modelo de objeto C++Modelo de objeto C++

Dados e funções da linguagem C

Na linguagem C, dados e funções são declarados separadamente.

  • dados
typedef struct point2d
{
    float x;
    float y;
} Point2d;
  • função

Imprima o valor de Point2d

void Point2d_print(const Point2d * pd)
{
    printf("(%f, %f)", pd->x, pd->y);
}

Classe C++

Perceba também a função da linguagem C, a seguinte definição pode ser feita em 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;
};

Pergunta: Point2d de C para C++, que mudanças ocorreram no layout da memória?

A resposta é nenhuma mudança.
Neste exemplo, os membros de dados em C++ são iguais aos de C. A diferença é que há uma função de membro não estática adicional impressa em C++, mas a função de membro não estática e os membros de dados são separados e não ocupam o tamanho da turma. Ou seja, a chamada da função print é na verdade print(Point2d* pd), assim como a chamada de Point2d_print na linguagem C.

A carga adicional do layout de memória C++ é causada pelo virtual, que inclui principalmente funções virtuais e classes base virtuais.

Modelo de objeto C++

Em C++,
existem dois tipos de membros de dados de classe: estáticos (estáticos) e não estáticos (não estáticos).
Existem três tipos de funções de membro de classe: funções estáticas (estáticas), funções não estáticas (não estáticas) e funções virtuais (virtuais). )

Modelo de objeto C++:

  1. Membros de dados não estáticos estão dentro da classe
  2. estático fora da classe
  3. Funções estáticas (estáticas) e funções não estáticas (não estáticas) fora da classe
  4. Função virtual (virtual):
    a. Cada classe gera vários ponteiros para funções virtuais e os coloca na tabela virtual (tabela virtual, vtbl)
    b. Adiciona um ponteiro à tabela virtual (vptr) para cada objeto de classe.
    c. O type_info (usado para suportar RTTI) de cada classe também é especificado pela tabela virtual, que geralmente está localizada no primeiro 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;
};

O modelo de objeto C++ do código acima é o seguinte

+---------------+
|  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()                   |
+-------------------------------------+       +------------------------------------+


Referência:

  1. Explore o modelo de objeto C++ em profundidade

Acho que você gosta

Origin blog.csdn.net/itas109/article/details/132031941
Recomendado
Clasificación