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.
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.
Polymorphismus bedeutet wörtlich mehrere (Poly) Formen (Morphen). In statisch typisierten Sprachen (wie C ++) gibt es drei Arten von Polymorphie.
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 >Sie können die Ole C Route nehmen und Gewerkschaften benutzen. Obwohl auch das chaotisch sein kann.
Tags und Links c++ virtual-functions