Compile-time vs run-time-Polymorphie in C++ - Vorteile/Nachteile

In C++, wenn es möglich ist, implementieren die gleiche Funktionalität, die entweder mit Laufzeit (sub-Klassen, virtuelle Funktionen) oder compile-Zeit (templates, überladen von Funktionen) Polymorphismus, warum würden Sie wählen einen über den anderen?

Ich würde denken, dass der kompilierte code größer wäre für compile-Zeit-Polymorphismus (mehr Methode/Klasse erstellten Definitionen für template-Typen), und das compile-Zeit würde Ihnen mehr Flexibilität, während der Laufzeit geben Sie "sicherer" Polymorphismus (d.h. schwieriger zu werden falsch verwendet, die durch Unfall).

Sind meine Annahmen korrekt? Gibt es irgendwelche anderen vor - /Nachteile? Kann mir jemand ein konkretes Beispiel nennen, wo beides wären gangbare Optionen doch der ein oder andere wäre eine deutlich bessere Wahl?

Auch, compile-Zeit-Polymorphismus produzieren, schneller code, da ist es nicht notwendig, rufen Funktionen über die vtable, oder wird dadurch optimiert werden, entfernt der compiler sowieso?

Beispiel:

class Base
{
  virtual void print() = 0;
}

class Derived1 : Base
{
  virtual void print()
  {
     //do something different
  }
}

class Derived2 : Base
{
  virtual void print()
  {
    //do something different
  }
}

//Run time
void print(Base o)
{
  o.print();
}

//Compile time
template<typename T>
print(T o)
{
  o.print();
}
Der große Nachteil der compile-Zeit-Polymorphismus ist, dass man manchmal einfach nicht tun. Wie Sie beim verwalten der Objekte durch eine Schnittstelle. Wie lange können Sie den compile-Zeit, denke, es ist besser für die meisten der Zeit. Und Sie können Ihre routine akzeptieren beide von Ihnen mit nur ein wenig Aufwand.
Die "Laufzeit" - Beispiel wird nicht kompilieren - kann man pass Basis-Klassen-Zeiger und erreichen dynamic dispatch, aber da Base ist Abstrakt, Sie kann nicht ein Objekt machen.
Mögliche Duplikate von C++ - templates für performance?

InformationsquelleAutor mclaassen | 2013-06-01

Schreibe einen Kommentar