Klassenmethoden vs. "normale" Funktionen
-
Hallo!
Was ist schneller: Der Aufruf von Klassenmethoden eines bestimmten Objektes oder der Aufruf von normalen Funktionen?
-
Hi,
nicht-statische Methoden sind ein kleines bißchen langsamer, weil der this-Zeiger übergeben werden muss, aber der Unterschied ist so minimal, dass man ihn ignorieren kann... lieber guten Stil wahren!
ChrisM
-
Die Frage ist völlig sinnlos, du hast effektiv nie die Wahl -- entweder du brauchst einen Zeiger auf ein Objekt, oder du brauchst ihn nicht. Beispiel:
class String { // ... public: size_t length() const; }; size_t length(const String&);
Egal, wie du die Länge bestimmst, ob über eine freie Funktion oder einen Memberfunktionsaufruf, der Pointer auf den String, um den es geht, muss irgendwie übergeben werden. Performancetechnisch nimmt sich das natürlich
nix.
-
Vielleicht sollte ich die Frage etwas anders stellen...
1. Fallstruct test { int var1; //Dummy-Variable bool var2; //s.o. }; //... void funktion(test param);
So habe ich ja ein struct was ich als Argument an eine Funktion übergebe.
2. Fall
class test { int var1; //Dummy-Variable bool var2; //s.o. public: void funktion(); }; //... test objekt; objekt.funktion();
Und hier eine Klasse mit einer Funktion die von dem Objekt aufgerufen wird.
Meine Frage: Was ist schneller?
-
Die übergabe by value ist natürlich langsamer. Das ist aber unfair.
Es muss heißen:void funktion(const test & param);
Und dann ist es egal.
-
Geschwindigkeitstechnisch ist es dann egal, obwohl man nie weiß, ob der Compiler nicht doch noch was optimiert, wenn du ne Methode vom Objekt machst.
Auf jeden Fall ist es besserer Stil.
-
Elementfunktionen sind nicht immer besserer Stil. Sie sind IMHO meistens besserer Stil, wenn sie ansonsten ein friend sein müssten. Der Rest ist Geschmackssache
-
Geschwindigkeitstechnisch ist es dann egal, obwohl man nie weiß, ob der Compiler nicht doch noch was optimiert, wenn du ne Methode vom Objekt machst.
Denkst du da an eine spezielle Optimierung, die nur mit Membern- nicht aber mit freien Funktionen funktioniert? Falls ja, könntest du die mal näher erklären. Mir erschlisst sich nämlich da nicht die Logik. Besonders unter Berücksichtigung der gängigen Umsetzungen.
Auf jeden Fall ist es besserer Stil.
How Non-Member Functions Improve Encapsulation
Nur zum Nachdenken, bevor die Aussagen zu allgemein und oberflächlich werden.
Was ist schneller: Der Aufruf von Klassenmethoden eines bestimmten Objektes oder der Aufruf von normalen Funktionen?
"Klassenmethoden" und "eines bestimmten Objektes" ist ein widerspruch in sich.
Zumindest für die gängige Definition des Begriffs Klassenmethode.
-
Denkst du da an eine spezielle Optimierung, die nur mit Membern- nicht aber mit freien Funktionen funktioniert? Falls ja, könntest du die mal näher erklären. Mir erschlisst sich nämlich da nicht die Logik. Besonders unter Berücksichtigung der gängigen Umsetzungen.
Ich bin kein Compilerbauer und du wahrscheinlich auch nicht.
Aber du kannst davon ausgehen, dass C++ Compiler auf Objektorientierung optimiert werden. Kleine Elementfunktionen werden bei mir (so wie es aussieht) fast immer inline gemacht (ohne dass ich sie inline deklariere).Nur zum Nachdenken, bevor die Aussagen zu allgemein und oberflächlich werden.
Ich hab mich konkret auf das Beispiel bezogen, ob
Objekt.Methode();
oder
Funktion(*pObjekt);Dabei ging es jetzt auch nicht speziell um Kapselung und besondere Situationen. Wenn es keine besonderen Umstände macht (meistens ist das der Fall), ist Objekt.Methode() IMO vorzuziehen. Vielleicht war meine Aussage auch zu allgemein formuliert.
-
@Optimizer: mir ist keine optimierung bekannt, die im angegebenen Beispiel bei einer Memberfunktion greifen würde, und bei einer globalen nicht.
Der compiler löst
void test::funktion()
auf nach
void _lustiger_name_funktion(test *)
und ab da ist eh' alles gleich (egal, ob du mit einer referenz statt pointer, oder einem const oder nicht arbeitest)
Unterschiede ergeben sich höchstens in der Parameterreihenfolge, was aber (zumindest im Mittel) keinen Einfluß auf die Optimierung haben sollte.
Das ganze ändert sich natürlich beim Aufruf einer virtuellen Funktion: hier kommt nochmal der VMT lookup dazu, aber der ist heute in den allermeisten Fällen eh' vernachlässig- und optimierbar.