Pergunta

Em C ++, que é a sobrecarga (memória / CPU) associado com herdar uma classe base que não tem funções virtuais? É tão bom como uma cópia se em linha reta + colar de membros da classe?

class a
{
public:
    void get();
protected:
    int _px;
}

class b : public a
{

}

em comparação com

class a
{
public:
    void get();
protected:
    int _px;
}

class b
{
public:
    void get();
protected:
    int _px;

}
Foi útil?

Solução

Não pode um ser sobrecarga de memória ligeira (devido ao preenchimento) ao usar herança em relação ao copiar e colar, considere as definições seguintes classes:

struct A
{
  int i;
  char c1;
};

struct B1 : A
{
  char c2;
};


struct B2
{
  int i;
  char c1;
  char c2;
};

sizeof (B1) será, provavelmente, 12, enquanto sizeof (B2) pode ser apenas 8. Isso ocorre porque a classe base Um fica preenchido separadamente a 8 bytes e, em seguida, B1 fica preenchido novamente para 12 bytes.

Outras dicas

Vai demorar muito ligeiramente mais tempo para compilar, e não haverá nenhuma sobrecarga de tempo de execução adicional. Da perspectiva do otimizador, métodos não-virtuais são os mesmos procedimentos - eles podem ser chamados usando apenas seu endereço de memória, sem a sobrecarga de uma tabela método virtual

.

Se você esquecer a herança virtual, ter uma classe base é equivalente, memória e desempenho sábio, para ter um membro da mesma classe. Exceptuam-se que ele pode, por vezes, ser ainda melhor (por exemplo uma classe vazia tem um tamanho de, pelo menos, um, mas tendo uma classe de base vazia pode muitas vezes têm nenhuma sobrecarga).

Se você pode ter um ponteiro do tipo base * que aponta para um objeto do tipo Derived *, você provavelmente precisa de um destrutor virtual e sua premissa original já não se aplica. Se a classe derivada tem um destrutor vazio, e não tem membros ou eles são todos os tipos POD, você pode sair sem um destrutor virtual, mas geralmente é melhor jogar pelo seguro e torná-lo virtual desde o início.

O compilador irá gerar uma chamada direta para o código de implementação de cada função de membro não-virtual, portanto, não há nenhuma sobrecarga.

Na verdade, não só aumentou a memória pela classe base. Você pode ler mais na aqui em C ++ FAQ

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top