Question

CRTP est suggéré dans cette question sur le polymorphisme dynamique. Cependant, ce modèle est prétendument seulement utile pour le polymorphisme statique. La conception que je suis à la recherche semble être entravée speedwise par des appels de fonctions virtuelles, comme laissé entrevoir ici. A de même 2,5x speedup serait fantastique.

Les classes en question sont simples et peuvent être codés complètement en ligne, mais on ne sait pas jusqu'à ce que l'exécution des classes qui seront utilisées. De plus, ils peuvent être enchaînées dans un ordre quelconque, entassant insulte performance sur blessure.

Toutes les suggestions (y compris la façon dont le CRTP peut être utilisé dans ce cas) d'accueil.

Modifier recherche sur Google se présente une mention de modèles de fonction. Ceux-ci semblent prometteurs.

Était-ce utile?

La solution

Je suis d'accord avec m-forte que vous n'allez pas pour éviter le polymorphisme d'exécution.

Si vous la valeur de l'optimisation sur l'élégance, essayez de remplacer par exemple

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

avec quelque chose comme

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...
  }
}

ce n'est pas jolie, certainement pas POO (plus un retour à ce que vous pourriez faire dans le bon vieux « C »), mais si les méthodes virtuelles sont assez trivial vous devriez obtenir une fonction sans appel (sous réserve assez bon compilateur et optimisation Les options). Une variante en utilisant dynamic_cast ou typeid peut-être un peu plus élégant / sûr, mais méfiez-vous que ces caractéristiques ont leur propres frais généraux qui est probablement comparable à un appel virtuel de toute façon.

Si vous aurez plus de chances de voir une amélioration de ce qui précède est si certaines méthodes de classes sont pas d'habitation, et il vous a sauvé de les appeler, ou si les fonctions contiennent du code de boucle invariant commun et l'optimisateur parvient à hisser hors de la boucle.

Autres conseils

polymorphisme signifie littéralement des formes multiples (poly) (morphes). Dans les langues statiquement typés (comme C ++), il existe trois types de polymorphisme.

  1. polymorphisme Adhoc: Ceci est mieux vu en C ++ en fonction et la surcharge de méthode. Le même nom de la fonction se lie à différentes méthodes basées sur la correspondance compilation type des paramètres de l'appel à la fonction ou la signature méthode.
  2. polymorphisme Parametric: Dans C ++ c'est des modèles et toutes les choses amusantes que vous pouvez faire avec elle, comme CRTP, la spécialisation, la spécialisation partielle, méta-programmation, etc. Encore une fois ce genre de polymorphisme où le même nom de modèle peut faire des choses différentes en fonction sur les paramètres du modèle est un compilation polymorphisme .
  3. Sous-type Polymorphisme: Enfin ce que nous pensons quand nous entendons le mot polymorphisme en C ++. C'est là les classes dérivées surchargent des fonctions virtuelles pour se spécialiser comportement. Le même type de pointeur vers une classe de base peut avoir un comportement différent en fonction du type dérivé de béton, il pointe. Ceci est la façon d'obtenir temps d'exécution polymorphisme en C ++.

Si on ne sait pas jusqu'à l'exécution des classes qui seront utilisées, vous devez utiliser Polymorphisme qui Subtype impliquera des appels de fonctions virtuelles.

appels de méthode virtuelle ont une très faible frais généraux de performance sur les appels liés statiquement. Je vous invite à examiner les réponses à cette question SO.

Vous pouvez aller à la Route Ole C et les syndicats d'utilisation. Bien que trop peut être salissant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top