Gibt es Alternativen zu Polymorphie in C ++?

7

Das CRTP wird in dieser Frage zum dynamischen Polymorphismus vorgeschlagen. Dieses Muster ist jedoch angeblich nur für statische Polymorphie nützlich. Der Entwurf, den ich betrachte, scheint durch virtuelle Funktionsaufrufe beschleunigt zu sein, da angedeutet hier. Eine Beschleunigung von sogar 2,5x wäre fantastisch.

Die fraglichen Klassen sind einfach und können vollständig inline codiert werden, jedoch ist bis zur Laufzeit nicht bekannt, welche Klassen verwendet werden. Darüber hinaus können sie in beliebiger Reihenfolge angekettet werden, um einen Leistungsschaden auf Verletzungen zu häufen.

Irgendwelche Vorschläge (einschließlich, wie das CRTP in diesem Fall verwendet werden kann) sind willkommen.

Bearbeiten: Beim Googlen werden Funktionsvorlagen erwähnt. Diese sehen vielversprechend aus.

    
casualcoder 25.02.2009, 02:51
quelle

3 Antworten

3

Ich stimme mit m-shar überein, dass Sie Laufzeit-Polymorphismus nicht vermeiden werden.

Wenn Sie Wert auf Optimierung gegenüber Eleganz legen, ersetzen Sie say

%Vor%

mit etwas wie

%Vor%

es ist nicht schön, sicherlich nicht OOP (mehr eine Umkehrung zu dem, was Sie in guten alten 'C' tun könnten), aber wenn die virtuellen Methoden trivial genug sind, sollten Sie eine Funktion ohne Aufrufe bekommen (abhängig von gut genug Compiler & amp; Optimierungsmöglichkeiten). Eine Variante, die dynamic_cast oder typeid verwendet, könnte etwas eleganter / sicherer sein, aber hüte dich davor, dass diese Features ihren eigenen Overhead haben, der sowieso mit einem virtuellen Aufruf vergleichbar ist.

Wenn Sie feststellen, dass einige Klassenmethoden keine Ops sind und Sie davor bewahrt haben, sie aufzurufen, oder wenn die Funktionen einen gemeinsamen Schleifeninvarianten-Code enthalten und der Optimierer es schafft, ihn anzuheben, werden Sie wahrscheinlich eine Verbesserung feststellen aus der Schleife.

    
timday 25.02.2009, 13:51
quelle
18

Polymorphismus bedeutet wörtlich mehrere (Poly) Formen (Morphen). In statisch typisierten Sprachen (wie C ++) gibt es drei Arten von Polymorphie.

  1. Adhoc-Polymorphismus: Dies ist am besten in C ++ als Überladen von Funktionen und Methoden zu sehen. Derselbe Funktionsname wird an verschiedene Methoden gebunden, die auf dem Kompilierzeit -Typ der Parameter des Aufrufs an die Funktion oder Methodensignatur basieren.
  2. Parametrische Polymorphie: In C ++ sind das Templates und all die lustigen Dinge, die man damit machen kann, wie CRTP, Spezialisierung, partielle Spezialisierung, Metaprogrammierung usw. Wiederum diese Art von Polymorphie, bei der derselbe Template-Name verschiedene Dinge basieren kann Auf den Vorlagenparametern ist eine Kompilierzeit Polymorphie.
  3. Subtyp Polymorphismus: Schließlich denken wir darüber nach, wenn wir das Wort Polymorphismus in C ++ hören. Dies ist der Fall, wenn abgeleitete Klassen virtuelle Funktionen überschreiben, um das Verhalten zu spezialisieren. Derselbe Typ von Zeiger auf eine Basisklasse kann auf der Grundlage des konkreten abgeleiteten Typs, auf den er verweist, ein unterschiedliches Verhalten aufweisen. Auf diese Weise erhalten Sie Laufzeit Polymorphismus in C ++.

Wenn bis zur Laufzeit nicht bekannt ist, welche Klassen verwendet werden, müssen Sie den Subtyp-Polymorphismus verwenden, der virtuelle Funktionsaufrufe beinhaltet.

Virtuelle Methodenaufrufe haben einen sehr geringen Leistungsaufwand gegenüber statisch gebundenen Aufrufen. Ich möchte Sie auffordern, die Antworten auf diese SO-Frage

zu lesen >     
m-sharp 25.02.2009 05:02
quelle
-1

Sie können die Ole C Route nehmen und Gewerkschaften benutzen. Obwohl auch das chaotisch sein kann.

    
Paul Nathan 25.02.2009 05:41
quelle

Tags und Links