Pregunta

El CRTP Se sugiere en esta pregunta sobre el polimorfismo dinámico.Sin embargo, este patrón supuestamente sólo es útil para el polimorfismo estático.El diseño que estoy viendo parece verse obstaculizado rápidamente por llamadas a funciones virtuales, como insinuado aquí. Una aceleración de incluso 2,5x sería fantástica.

Las clases en cuestión son simples y se pueden codificar completamente en línea; sin embargo, hasta el tiempo de ejecución no se sabe qué clases se utilizarán.Además, pueden estar encadenados, en cualquier orden, acumulando insulto sobre lesión.

Cualquier sugerencia (incluido cómo se puede utilizar el CRTP en este caso) es bienvenida.

Editar: Al buscar en Google aparece una mención de plantillas de funciones.Estos parecen prometedores.

¿Fue útil?

Solución

Estoy de acuerdo con m-afilada que usted no va a evitar que el polimorfismo en tiempo de ejecución.

Si el valor de la optimización sobre la elegancia, intente reemplazar digamos

void invoke_trivial_on_all(const std::vector<Base*>& v)
{
  for (int i=0;i<v.size();i++)
    v[i]->trivial_virtual_method();
}

con algo como

void invoke_trivial_on_all(const std::vector<Base*>& v)
{
  for (int i=0;i<v.size();i++)
  {
    if (v[i]->tag==FooTag)
      static_cast<Foo*>(v[i])->Foo::trivial_virtual_method();
    else if (v[i]->tag==BarTag)
      static_cast<Bar*>(v[i])->Bar::trivial_virtual_method();
    else...
  }
}

no es bastante, ciertamente no programación orientada a objetos (más una vuelta a lo que se podría hacer en el bueno de 'C'), pero si los métodos virtuales son lo suficientemente trivial que debe obtener una función sin llamadas (sujeto a lo suficientemente bueno compilador y optimización opciones). Una variante utilizando dynamic_cast o typeid podría ser un poco más elegante / seguro, pero ten en cuenta que estas características tienen su propia cabeza, que es probablemente comparable a una llamada virtual de todos modos.

Dónde muy probable que vea una mejora de lo anterior es que si algunos métodos de clases hay-ops, y se salvaron de llamarlos, o si las funciones contienen código de lazo invariante común y el optimizador se las arregla para izarla fuera del bucle.

Otros consejos

Polimorfismo significa literalmente múltiples (poli) formas (morfosis).En lenguajes de tipo estático (como C++) existen tres tipos de polimorfismo.

  1. Polimorfismo ad hoc:Esto se ve mejor en C++ como sobrecarga de funciones y métodos.El mismo nombre de función se vinculará a diferentes métodos según la coincidencia del tiempo de compilación tipo de los parámetros de la llamada a la función o firma del método.
  2. Polimorfismo paramétrico:En C++ se trata de plantillas y todas las cosas divertidas que puedes hacer con ellas, como CRTP, especialización, especialización parcial, metaprogramación, etc.Nuevamente, este tipo de polimorfismo en el que el mismo nombre de plantilla puede hacer cosas diferentes según los parámetros de la plantilla es un tiempo de compilación polimorfismo.
  3. Polimorfismo de subtipo:Finalmente, esto es en lo que pensamos cuando escuchamos la palabra polimorfismo en C++.Aquí es donde las clases derivadas anulan las funciones virtuales para especializar el comportamiento.El mismo tipo de puntero a una clase base puede tener un comportamiento diferente según el tipo derivado concreto al que apunta.Esta es la manera de conseguir tiempo de ejecución Polimorfismo en C++.

Si no se sabe hasta el tiempo de ejecución qué clases se utilizarán, debe utilizar polimorfismo de subtipo, que implicará llamadas a funciones virtuales.

Las llamadas a métodos virtuales tienen una sobrecarga de rendimiento muy pequeña en comparación con las llamadas vinculadas estáticamente.Te insto a que mires las respuestas a esto. Entonces pregunta.

Usted puede ir la ruta C Ole y los sindicatos de uso. A pesar de que también puede ser un poco incómodo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top