inline templates
-
Bin gerade dabei verschiedene Sortieralgorithmen als template-Funktionen zu implementieren.
Warum verlangsamen sich die Algorithmen um gut 15%, wenn ich das Tauschen der Elemente in eine eigene Funktion auslagere?
Beim inlinen sollte doch letztendlich genau das Gleiche rauskommen, wie wenn ich den Tausch direkt im Algorithmus durchführe zumal die Funktion ja auch sehr klein ist.
template <typename T> inline void Swap(T &a, T &b) { const T Tmp = a; a = b; b = Tmp; }
Kann es an meinem Compiler liegen (BCB6-Ent)? Hab sowieso manchmal den Eindruck das Borlandding liefert manchmal recht seltsamen Assembler-Code.
-
Bist du dir sicher, dass die Funktion geinlined wird? Wenn du zum Beispiel im Debugmodus kompilierst, wird in der Regel inline-Ingoriert.
-
Hallo,
Man kann im BCB6 im Debugmodus auch einstellen, dass inline trotzdem verwendet wird. Ich hab das grad mal gemacht. Der ASM-code zeigte eigentlich, dass die Funktion inline war (eine Folge von 6x mov statt Funktionsaufruf). Ich habe jetzt aber keinen Performancetest gemacht.
-
Kann es sein, daß du (wie die C-Funktion qsort()) die Adresse einer Funktion übernimmst? Wenn diese über einen Funktionspointer aufgerufen wird, dann kann sie natürlich nicht inline aufgelöst werden...
Moritz
-
nein,
da ich mit template arbeite, bedarf es keines funktionspointers (fuer vergleichsfunktion).
die funktion wurde auch geinlined.
wenn ich die vertauschung im code mache, sind es weniger mov-anweisungen, als wenn ich die zusaetzliche funktion verwende.