2010-05-01 2 views
6

Ich frage mich, ob es Vorteile gibt, eine statische Elementfunktion zu verwenden, wenn es ein nicht statisches Äquivalent gibt. Führt dies zu einer schnelleren Ausführung (weil Sie sich nicht um alle Mitgliedsvariablen kümmern müssen) oder weniger Speicherbedarf (weil sie nicht in allen Instanzen enthalten sind)?Vorteil der Verwendung einer statischen Elementfunktion anstelle einer äquivalenten nicht statischen Elementfunktion?

Grundsätzlich ist die Funktion, die ich betrachte, eine Dienstprogrammfunktion, um ein Integer-Array zu drehen, das Pixelfarben mit einer beliebigen Gradzahl um einen beliebigen Mittelpunkt darstellt. Es befindet sich in meiner abstrakten Bullet-Basisklasse, da nur die Bullets es verwenden werden und ich nicht den Overhead haben wollte, es in einer Utility-Klasse aufzurufen. Es ist ein bisschen zu lang und in jeder einzelnen abgeleiteten Bullet-Klasse verwendet, so dass es wahrscheinlich keine gute Idee zu inline ist. Wie würden Sie vorschlagen, dass ich diese Funktion definiere? Als statische Member-Funktion von Bullet, einer nicht-statischen Member-Funktion von Bullet, oder vielleicht nicht als Mitglied von Bullet, aber außerhalb der Klasse in Bullet.h definiert? Was sind die Vor- und Nachteile von jedem?

Antwort

9

Es gibt absolut keinen Leistungsunterschied zwischen statischen Elementfunktionen und freien Funktionen.

Aus einer Design-Perspektive, es klingt wie die betreffende Funktion hat sehr wenig mit Bullets zu tun, so würde ich bevorzugen, es in eine Dienstprogramm-Bibliothek irgendwo, es gibt keinen Laufzeitaufwand dabei, nur zusätzliche Entwickler Aufwand wenn Sie haben nicht schon eine solche Bibliothek.

In Bezug auf die ursprüngliche Frage, wenn die Funktion nicht offensichtlich zu einer bestimmten Klasse gehört, sollte es eine freie Funktion sein. Es sollte höchstens zu einem Namensraum gehören, um dessen Umfang zu kontrollieren. Und selbst wenn es sich meistens um eine Klasse handelt, würde ich immer noch die freie Funktion bevorzugen, es sei denn, die Funktion benötigt Zugriff auf private Mitglieder.

+0

Ja, ich bin mir nicht sicher, wie C++ funktioniert. Ich komme aus einem Flash-Hintergrund und ActionScript hat schreckliche Gemeinkosten an den seltsamsten Orten - statische Funktionen in Utility-Klassen werden zur Laufzeit aufgelöst, so wie Math.sin bei jeder Verwendung muss der Spieler die Math-Klasse durch die Hashtabelle finden und dann finden sin-Funktion.Ich bin froh zu hören, dass C++ zumindest einen gesunden Menschenverstand hat. – jonathanasdf

+3

@Zan: statische Elementfunktionen haben keinen "this" -Zeiger. –

+0

Tatsächlich hast du recht. Ich habe die Zeile gelesen, auf die ich geantwortet habe: "Es gibt absolut keinen Leistungsunterschied zwischen Elementfunktionen und freien Funktionen." was nicht genau das ist, was es sagt. Mein Fehler. –

1

Wenn die Methode im Klassennamespace sein muss, aber nicht für eine Instanz dieser Klasse verwendet wird (d. H. this wird nicht verwendet, werden keine nicht statischen Methoden verwendet), sollte sie static lauten.

Von Anfang an benutzte ich statische Methoden ein paar Mal, wenn ich eine Klasse hatte, die ihre Instanzen verfolgte. Es wurde eine doppelt verknüpfte Liste verwendet, der Konstruktor eingefügt und der Destruktor entfernte das Objekt aus der Liste. Das Objekt selbst hatte die vorherigen und nächsten Zeiger als Mitglieder, und der erste und der letzte Zeiger waren statische Mitglieder und alle diese Zeiger waren privat. Alle Methoden, die auf der Liste arbeiteten, z. suchen oder zählen, waren statische Methoden.

3

In der Regel static wird verwendet, wenn möglich, um die Notwendigkeit für ein Objekt zu beseitigen und die externe this Argument zu beseitigen.

Aber eine Ausnahme ist in Funktoren: Klassen, die operator() definieren, so dass Objekte als Funktionen "aufgerufen" werden können. Idiomatisch wie ein operator() ist innerhalb der class {} Block deklariert, die es inline macht.

Dann, wenn die Funktion klein ist, ist es in die aufrufende Funktion inline und der this Zeiger ist optimiert.

Wenn die Funktion groß ist, ist sie möglicherweise nicht inline. Aber der winzige Nachteil, ein zusätzliches Argument zu haben, wird wahrscheinlich in den Schatten gestellt.