Globale Funktionen oder Objekte--> Schneller?

zoidberger

Mitglied
Hallo Leute.

Ja, die Überschrift zu dem Thread ist ein wenig blöd.. allerdings wüsste ich nicht wie ich das mit wenig worten beschreiebn soll ;)

Und zwar bin ich gerade an einer Motorsteuerung, die später auf einer Kleinen Steuerung laufen soll. Da diese Steuereinheit in "echtzeit" arbeitet und nicht soo viel Rechenleistung und Ressourcen zur Verfügung hat, überlege ich nun was schneller geht. (Von wegen Sicherheit müsst ihr euch keine Gedanken machen.. da wird keiner ne globale variable hacken können ;) )

Was ist denn nun schneller?
Eine Globale Funktion oder eine Memberfunktion eines Objekts?
Und wie sieht das mit Objektaufrufen und Zeigern aus?
Gibts iiiirgendwo im Netz eine Auflistung der Rechenzeit der einzelnen Funktionen und Techniken?


Vielen Dank im Vorraus!
 
Hallo,

nach dem Kompilieren und Linken bleibt von der strukturierten Programmierung sowieso nichts mehr übrig. Der Aufruf einer Funktion ist von dem einer Methode auf der Ebene des Maschinencodes nicht mehr zu unterscheiden.
Die Instanziierung von Objekten wird wohl eher nur Auswirkungen auf den Speicherverbrauch haben, als Geschwindigkeitseinbußen bewirken. Zeiger enthalten die Adresse eines Speicherbereiches, was soll damit sein? Entscheidend ist, was man mit diesen Speicherbereichen anstellt.

Gruß
MCoder
 
Hallo,

nach dem Kompilieren und Linken bleibt von der strukturierten Programmierung sowieso nichts mehr übrig. Der Aufruf einer Funktion ist von dem einer Methode auf der Ebene des Maschinencodes nicht mehr zu unterscheiden.
So ganz stimmt das ja nur für statische Methoden.

Bei jedem Aufruf einer Methode wird der this-Zeiger implizit als Argument an die Methode übergeben. Das verbraucht einerseits CPU Zyklen, andererseits Stackspeicher. D.h. rekursive Aufrufe einer Methode führen eher zum Stacküberlauf als die einer normalen Funktion.

Verwendet man virtuelle Methoden kommt für die entsprechenden Klassen eine VTable und RunTime Type Information hinzu. Außerdem werden Methodenaufrufe über Zeiger und Referenzen dann erst zur Laufzeit aufgelöst, was wiederum Zeit in Anspruch nimmt.

Gruß
 
Also hab ich das nun richtig verstanden, dass es zumindest keinen großen Unterschied zwischen Memberfunktionen einer Klasse und globalen Funktionen gibt?

Das mit den Zeigern hab ich nun jedoch noch nicht ganz verstanden.
Ich kann doch entweder eine Klasse instanziieren, also ein Objekt der Klasse erzeugen und dann Funktionen folgendermaßen aufrufen: 'objekt.funktion();'
Oder eben (globale) Zeiger erzeugen und dann die Funktion mit 'klasse->funktion();' aufrufen.

Ich habe hier ein Paar beispielprogramme, bei denen komischerweise immer nur Zeiger verwendet werden.. vielleicht war es einfach nur ein schlechter Programmierer, der das gemacht hat. Oder eben er wusste was, was ich noch nicht weiß ;)

Vielen Dank für eure Antworten schonmal!
 
Ich habe hier ein Paar Beispielprogramme, bei denen komischerweise immer nur Zeiger verwendet werden.. vielleicht war es einfach nur ein schlechter Programmierer, der das gemacht hat;)

Moin,

das hat nichts mit schlecht oder gut zu tun ... :eek:
Es gibt ja gute Gründe, um Zeiger zu verwenden :p

Wenn Du bspw. einen Zeiger als Parameter an eine Funktion übergibst, sind die Änderungen, die Du hieran innerhalb der Funktion vornimmst, dann auch außerhalb - also an der aufrufenden Stelle - sichtbar! Quasi so, als wenn dieser Wert als Return-Code zurückgegeben werde würde! Dies ist vor allem hilfreich, wenn von einer Funktion zwei oder mehr Werte geändert werden sollen ...

Das Problem der Zeiger-Arithmetik ist halt nur, dass man schon recht genau wissen sollte, was man tut, da ein Verbiegen von Zeigern oder ähnliches sehr schnell zu Speicherproblemem (Speicherlecks, Zugriffe auf falsche Speicherbreiche etc.) führt, die dann zu (meist unkontrollierten) Abstürzen führen .....

Die quasi statische Aufrufrufweise ("objekt.funktion();") ist hier zumindest etwas sicherer und (meistens) besser nachvollziehbar !!

Gruß
Klaus
 
Zuletzt bearbeitet:
Also hab ich das nun richtig verstanden, dass es zumindest keinen großen Unterschied zwischen Memberfunktionen einer Klasse und globalen Funktionen gibt?
Ja, groß ist der Unterschied nicht. Methoden und Funktionen unterscheiden sich nur im Hinblick auf den this-Zeiger.
Das mit den Zeigern hab ich nun jedoch noch nicht ganz verstanden.
Ich kann doch entweder eine Klasse instanziieren, also ein Objekt der Klasse erzeugen und dann Funktionen folgendermaßen aufrufen: 'objekt.funktion();'
Oder eben (globale) Zeiger erzeugen und dann die Funktion mit 'klasse->funktion();' aufrufen.
Polymorphie ist ausschließlich mit Zeigern oder Referenzen (intern auch Zeiger) möglich.

Allerdings braucht die dynamische Allozierung auch wieder Zeit (vor allem wenn der Speicher schon stark fragmentiert ist).

Dann kommt noch die Ausnahmebehandlung hinzu: man muss sicherstellen, das bei eine Ausnahme die erzeugten Objekte wieder weggeräumt werden sonst enstehen Speicherlecks. Bei einer automatischen Variablen wird das vom Compiler sichergestellt (nach dem RAII Prinzip) bei Zeigern muss man explizit aufräumen.

Gruß
 
Zurück