Otimização: Polimorfismo "estático"

Dezembro 2016

* O polimorfismo é um dos pilares do paradigma objeto

Em C++, ele se expressa em forma de funções virtuais: eles podem adaptadar, de forma dinâmica, (ou seja, na execução) o seu código ao tipo de objeto aos quais elas são aplicadas. Isso pode ter um impacto negativo no desempenho, especialmente nos casos em que:
  • O código dentro dessas funções é curto;
  • Essas funções são chamadas com frequência.


Na verdade, como o compilador não sabe com antecedência o código a ser aplicado, ele não pode aplicar as otimizações usuais. Além disso, o custo do espaço de memória é tão grande quanto as conexões possíveis (para cada tipo de objeto) são numerosas.

Ela consiste em declarar a classe parente como classe genérica, recebendo como parâmetro o tipo da classe derivada. Depois, esta classe irá delegar tudo aos seus herdeiros (como uma classe abstrata que só tem funções virtuais puras), mas assim, o código a ser aplicado é conhecido no momento da compilação.


Veja um pequeno exemplo:
// classe de base configurada pelo tipo da classe derivada 
template<class TipoCriança> 
classe Matriz { 
público: 
  // função de delegação 
  TipoCriança& ComoUmaCriança() 
  { 
    return (static_cast<TipoCriança&>(*this)); 
  } 

  // sobrecarga por delegação 
  duplo operador()(int i, int j) 
  { 
    return (ComoUmaCriança()(i,j)); 
  } 
private: 
  ... 
}; 

// exemplos de classes derivadas 
class MatrizTriangular : público Matriz<MatrizTriangular> { 
private: 
  ... 
}; 

class MatrizSymétrica: público Matriz<MatrizSimétrica> { 
private: 
  ... 
}; 

// função "virtual" funcionando comqualquer tipo de matriz 
template<class TipoCriança> 
dupla norma(Matriz<TipoCriança>&); 

// exemplo de aplicação 
dupla nt, ns; 
MatrizTriangular mt; 
MatrizSimétrica   ms; 
nt = norma(mt); 
ns = norma(ms); 


No entanto, não é totalmente flexível, pois qualquer acréscimo será feito, na maioria dos casos, em, pelo menos, dois lugares no código, na interface da classe derivada e na classe de base. Por isso, eu recomendo que este método seja utilizado quando a interface estiver congelada e, como diz o título, quisermos otimizar o código.


Tradução feita por Lucia Maurity y Nouira

Veja também :
Este documento, intitulado « Otimização: Polimorfismo "estático" »a partir de CCM (br.ccm.net) está disponibilizado sob a licença Creative Commons. Você pode copiar, modificar cópias desta página, nas condições estipuladas pela licença, como esta nota aparece claramente.