Ist es effizienter, einen Funktor ohne Mitglieder, ein Klassenmitglied oder ein Stapelobjekt zu erstellen?

8

Ich habe einen Funktor ohne Mitgliedsvariablen. Ich frage mich, ob es effizienter ist, diesen Funktor bei Bedarf zu erstellen oder ihn als Membervariable zwischenzuspeichern. Es gibt Probleme in Bezug auf die Optimierung der leeren Basisklasse und den Cache-Standort, über die ich mir nicht sicher bin.

%Vor%     
Nathan Doromal 18.10.2013, 13:47
quelle

2 Antworten

9

Für ein leeres Objekt erstellen Sie es einfach im Stapel. Wenn Sie den Funktor Ihrem Typ als Mitglied hinzufügen, werden alle Ihre Objekte größer. Wenn Sie es als Basis hinzufügen (um die leere Basisoptimierung zu verwenden), erhalten Sie ein seltsames Design, bei dem Ihr Typ operator()(const MyData&) ohne Grund implementiert. Selbst wenn Sie es privat machen, wird der Operator da sein.

Da der Typ keine Mitglieder hat, gibt es keine Cache-Lokalität Probleme, da auf keine Daten zugegriffen werden kann. Die Hauptverwendung eines statuslosen Funktors besteht darin, dem Compiler zu ermöglichen, den Aufruf der Funktion zu verknüpfen (im Vergleich zu einer freien Funktion mit demselben Namen)

    
David Rodríguez - dribeas 18.10.2013, 14:02
quelle
0

Die allgemeine Regel für die Optimierung lautet: Code, damit er zuerst funktioniert und nur dann optimiert wird, wenn er sich als notwendig erweist (mit anderen Worten, Sie haben Ihren Code profiliert und einen Engpass gefunden, der behoben werden muss, um die Leistung erheblich zu verbessern ).

    
Zac Howland 18.10.2013 14:06
quelle

Tags und Links