Forum: PC-Programmierung class X (in C++) mehrfache instanzieren: ist das gut oder ganz schlecht


von Ben (Gast)


Lesenswert?

Hallo alle zusammen,

Programmiersprache: C++

Ich habe eine Frage:
Wie gut bzw. kritisch ist, wenn eine Klasse X mehrfach instanziert ist?

Mir ist schon klar, dass die Klasse X jedes mal beim neuen Instanzierung 
neue aufgerufen und erzeugt wird.

Das ist nicht so geschickt aber auf andere Seite möchte ich nicht die 
Klasse X global instanzieren.

Mir ist auch klar, dass die Performance daraunter leidet....

Hat meine beschriebene Vorgehen auf die Konsistenz der SW?
Danke in Voraus

von Mladen G. (mgira)


Lesenswert?

In OOP Sprachen ist es ganz normal Objekte zu erstellen.

von Max D. (max_d)


Lesenswert?

Ob die mehrfache Instanzierung einen Einfluss auf die Stabilität und 
Leistung hat hängt von dem Code der Klasse ab. Viele GUI Sachen 
instanzieren ja auch die Klassen hundertfach ohne, dass es Probleme 
gibt.
Auf der anderen Seite reichen schon zwei Instanzen die beide auf einer 
Datei rumschreiben (ohne Mutex) damit nurnoch Müll und Chaos rauskommt.

von Narfie (Gast)


Lesenswert?

Normalerweise haben Klassen genau den Sinn mehrfach instanziiert zu 
werden. Falls du tatsächlich nur eine Instanz brauchst, google mal nach 
Singleton und C++, da findest du eine Lösung für dein Problem.

von Dr. Sommer (Gast)


Lesenswert?

Der Sinn von Klassen ist es, dass sie mehrfach instanziert werden.

Ben schrieb:
> Mir ist schon klar, dass die Klasse X jedes mal beim neuen Instanzierung
> neue aufgerufen und erzeugt wird.
Man kann eine Klasse nicht "aufrufen" oder "erzeugen". Man kann 
höchstens Instanzen einer Klasse anlegen.

Ben schrieb:
> Mir ist auch klar, dass die Performance daraunter leidet....
Wenn du tatsächlich nur 1 Instanz brauchst kannst du sie einmal anlegen 
und Referenzen darauf übergeben. Wenn du mehrere brauchst, musst du 
mehrere anlegen. Die "Performance leidet" ist dann Unsinn, weil im 
Vergleich zu welcher Lösung leidet sie? Es gibt dann keine andere ohne 
mehrere Instanzen anzulegen...

von Orangenhaut (Gast)


Lesenswert?

Und pass auf mit new und delete falls du dynamische Istanzen erstellst.

von Mark B. (markbrandis)


Lesenswert?

Ben schrieb:
> Mir ist schon klar, dass die Klasse X jedes mal beim neuen Instanzierung
> neue aufgerufen und erzeugt wird.

Du meinst wohl, dass der Konstruktor bzw. einer der Konstruktoren der 
Klasse aufgerufen wird.

> Das ist nicht so geschickt

Warum nicht?

> Mir ist auch klar, dass die Performance daraunter leidet....

Nein. Es sei denn vielleicht Du meinst auf einem System mit sehr wenig 
Hauptspeicher, à la (sehr) kleiner Mikrocontroller. Da wird man C++ auch 
nicht unbedingt einsetzen.

> Hat meine beschriebene Vorgehen auf die Konsistenz der SW?

Probleme wird es z.B. dann geben, wenn eine Klasse Ressourcen bindet und 
diese nicht wieder freigibt. Das prominenteste Beispiel ist hier sicher 
Speicherplatz (siehe Memory Leaks).

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Hallo Ben,

Ben schrieb:

> Das ist nicht so geschickt aber auf andere Seite möchte ich nicht die
> Klasse X global instanzieren.
>
> Mir ist auch klar, dass die Performance daraunter leidet....

mit Verlaub: Dir scheint einiges noch nicht so ganz klar zu sein ;-) 
Klassen sind Vorlagen für Objekte, wenn Du mehrere Objekte des gleichen 
Typen (Klasse) brauchst, dann solltest Du mehre Objekte dieser Klasse 
anlegen. Welchen Problem vermutest Du, bzw. was soll daran kritisch 
sein?

Klassen werden auch nicht aufgerufen. Es werden Funktionen einer Klasse 
aufgerufen; entweder über ein Objekt der Klasse, oder über die Klasse 
selbst (static function). Es gibt zwei besondere Funktionen, die unter 
Umständen explizit aufgerufen werden: der Konstruktor und Destruktor 
(und das ist gut und richtig).

mfg Torsten

P.S: 
http://www.amazon.de/C-Programming-Language-Bjarne-Stroustrup/dp/0321563840

: Bearbeitet durch User
von Ben (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Wenn du tatsächlich nur 1 Instanz brauchst kannst du sie einmal anlegen
> und Referenzen darauf übergeben. Wenn du mehrere brauchst, musst du
> mehrere anlegen. Die "Performance leidet" ist dann Unsinn, weil im
> Vergleich zu welcher Lösung leidet sie? Es gibt dann keine andere ohne
> mehrere Instanzen anzulegen...



Mark Brandis schrieb:
> Warum nicht?
Ich bin davon ausgegangen:
Wenn ich eine klasse mehr fach instanziere (in unterschiedliche 
Stellen), wird SW langsamer....

Torsten Robitzki schrieb:
> Welchen Problem vermutest Du, bzw. was soll daran kritisch
> sein?
Die Klasse, die ich instanziere ist eine Klasse, die für die 
Netzwerkverbindung zustandig ist.
In der Konstruktur wird die Netztwerkverbindung  und gegebenfalls der IP 
Adresse auf korrektheit geprüft.
Aus diesem grund habe ich gedacht:
 Bei jede neue Instanzierung, wird auch die Netztwerkverbindung geprüft

was ist mit der Performance?

von Dr. Sommer (Gast)


Lesenswert?

Aus der Tatsache, dass es für die Funktionalität deines Programms 
scheinbar egal ist wie viele Instanzen der Klasse du anlegst, und es nur 
einen Einfluss auf die Performance hat, kannst du folgern dass deine 
Klasse nutzlos ist. Lösche die Klasse, und lagere Dinge wie das Prüfen 
der Netzwerkverbindung in einzelne Funktionen aus, die du wenn benötigt 
aufrufst.

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Ben schrieb:

> Die Klasse, die ich instanziere ist eine Klasse, die für die
> Netzwerkverbindung zustandig ist.
> In der Konstruktur wird die Netztwerkverbindung  und gegebenfalls der IP
> Adresse auf korrektheit geprüft.

Wenn Du mehrere Netzwerkverbindungen brauchst und eine Klasse hast, die 
eine Netzwerkverbindung modelliert, dann ist es nur natürlich, dass Du 
mehrere Instanzen dieser Klasse hast. Wenn Du nur eine Verbindung hast, 
dann solltest Du auch nur eine Instanz dieser Klasse haben.

Wenn Du mehrere Verbindungen zur gleichen IP-Adresse hast, und nicht für 
jede Verbindung die "Korrektheit" der IP-Adresse prüfen möchtest, dann 
solltest Du es so modelieren (z.B. in dem Du die Prüfung in eine 
IP-Klasse auslagerst).

> Aus diesem grund habe ich gedacht:
>  Bei jede neue Instanzierung, wird auch die Netztwerkverbindung geprüft

Wenn das so ist und Du möchtest es nicht, dann wähle ein anderes Design. 
Das ist doch das tolle an Software. Also: Anforderungen klar machen und 
dann ein Design erstellen, dass den Anforderungen gerecht wird.

> was ist mit der Performance?

Kommt drauf an. Erfahrungsgemäß machen sich Berufsanfänger viel, viel, 
viel zu viel Sorgen um Performance, mit dem Erfolg, dass dabei Software 
entsteht, die nicht mehr optimierbar ist.

mfg Torsten

: Bearbeitet durch User
von Konrad S. (maybee)


Lesenswert?

Ben schrieb:
> und gegebenfalls der IP
> Adresse auf korrektheit geprüft.

Wie prüfst du denn eine IP-Adresse auf Korrektheit?
Lass den Quatsch! Werte die Aufrufe deines Netzwerk-Stacks aus. Der sagt 
dir schon, wenn etwas nicht stimmt.

von Peter II (Gast)


Lesenswert?

Ben schrieb:
> Die Klasse, die ich instanziere ist eine Klasse, die für die
> Netzwerkverbindung zustandig ist.
> In der Konstruktur wird die Netztwerkverbindung  und gegebenfalls der IP
> Adresse auf korrektheit geprüft.

die Frage ist ob nicht ein paar static Methoden in einer Klasse dafür 
ausreichend sind. Musst das objekt dann sich einen zustand merken?

von Ben (Gast)


Lesenswert?

Konrad S. schrieb:
> Wie prüfst du denn eine IP-Adresse auf Korrektheit?
> Lass den Quatsch! Werte die Aufrufe deines Netzwerk-Stacks aus. Der sagt
> dir schon, wenn etwas nicht stimmt.

Die IP-Adresse wird in der GUI eingegeben und wird dann mit dem 
IP-Adresse des Oziloskope verglichen?
Simmen über ein --> dann passt
Ist es nicht der Fall--> Fehlermeldung "Netzwerk....."

Peter II schrieb:
> Musst das objekt dann sich einen zustand merken?

Ja

von Konrad S. (maybee)


Lesenswert?

Ben schrieb:
> Die IP-Adresse wird in der GUI eingegeben und wird dann mit dem
> IP-Adresse des Oziloskope verglichen?

Wozu muss man etwas in einer GUI eingeben, wenn der korrekte Wert als 
Vergleichswert schon bekannt ist?

von P. M. (o-o)


Lesenswert?

Es wurde nun viel über das mehrfache Instanzieren einer Klasse 
geschrieben, das alles ist gut und richtig. ABER es sieht ganz so aus, 
als sei der Thread-Starter Ben noch längst nicht so weit. Die 
Fragestellung weist deutlich darauf hin, dass keine richtigen Grundlagen 
in C++ vorhanden sind. Ben, ich würde mir unbedingt ein solides 
C++-Fundament erarbeiten. Das ist viel aufwändiger als bei C oder bei 
Java, aber wenn du dir die Zeit nicht nimmst, so wirst du mit deinem 
Programm garantiert ganz gewaltig ins Messer laufen.

von Mark B. (markbrandis)


Lesenswert?

Konrad S. schrieb:
> Ben schrieb:
>> Die IP-Adresse wird in der GUI eingegeben und wird dann mit dem
>> IP-Adresse des Oziloskope verglichen?
>
> Wozu muss man etwas in einer GUI eingeben, wenn der korrekte Wert als
> Vergleichswert schon bekannt ist?

Vielleicht gibt es mehr als ein Oszilloskop. Wenn die alle feste 
IP-Adressen haben, dann wäre es natürlich gescheiter das in der 
Benutzeroberfläche auch so abzubilden. (z.B. Auswahl durch Anklicken)

Und wieder mal haben wir den klassischen Fall von: "Beschreibe nicht 
Deinen Lösungsansatz, sondern beschreibe die Aufgabenstellung."

: Bearbeitet durch User
von chris (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Man kann eine Klasse nicht "aufrufen" oder "erzeugen". Man kann
> höchstens Instanzen einer Klasse anlegen.

Doch. Eine Instanz "erzeugt" eine Kopie der Klasse im Hauptspeicher. Die 
Instanz verweist dann anschließend auf den Adressbereich.

Ben schrieb:
> Wie gut bzw. kritisch ist, wenn eine Klasse X mehrfach instanziert ist?

Tatsächlich ist das kritisch. Solltest du an einer unbedachten Stelle 
deine Klasse instanziieren, z.b. einer Schleife mit tausenden 
Durchläufen, dann wird die Performance darunter leiden, ganz klar

Gruß
chris

von Jay (Gast)


Lesenswert?

chris schrieb:
> Dr. Sommer schrieb:
>> Man kann eine Klasse nicht "aufrufen" oder "erzeugen". Man kann
>> höchstens Instanzen einer Klasse anlegen.
>
> Doch. Eine Instanz "erzeugt" eine Kopie der Klasse im Hauptspeicher.

Nein. Die Klasse wird nicht kopiert, schon gar nicht von einer Instanz, 
Beim Instantiieren einer Klasse wird im Normalfall (es gibt sicher 
obskure Ausnahmen) der Speicherplatz für den State der Instanz und 
eventuell für ein paar Verwaltungsinformationen, irgendwo 
alloziert/reserviert und u.a. mittels Konstruktor initialisiert. Der 
Code wird zum Beispiel nicht kopiert.

> Die
> Instanz verweist dann anschließend auf den Adressbereich.

Nein. Der Adressbereich, die zugehörigen Daten, etc. sind die Instanz, 
auf den man eine irgendwie gearteten Verweis (Referenz, Pointer) haben 
sollte.

> Ben schrieb:
>> Wie gut bzw. kritisch ist, wenn eine Klasse X mehrfach instanziert ist?
>
> Tatsächlich ist das kritisch.

Es ist genauso kritisch oder unkritisch wie jeder andere Code. Wer Müll 
kodiert, der bekommt Müll.

> deine Klasse instanziieren, z.b. einer Schleife mit tausenden
> Durchläufen, dann wird die Performance darunter leiden, ganz klar

Wenn ich tausend Instanzen brauche, dann brauche ich tausend Instanzen. 
Wenn ich keinen Müll programmiert habe, aber meine Plattform das nicht 
hergibt, dann habe ich halt die falsche Plattform ausgewählt, bzw. die 
falsch dimensioniert. Das kann bei jedem Programmierparadigma passieren.

Man kann kein Omelett machen ohne Eier zu zerbrechen.

von Fritz G. (fritzg)


Lesenswert?

So schlimm ist es auch nicht, es wird ja nicht eine Kopie der ganzen 
Klasse erzeugt. Die Methoden werden nicht kopiert, die sind ja schon im 
Speicher. Daten werden auch nicht kopiert, erst beim Schreiben werden 
sie angelegt.
Es wird halt der Konstruktor aufgerufen und dann ev. Daten angelegt wenn 
sie im Konstruktor beschrieben werden.

: Bearbeitet durch User
von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

Fritz Ganter schrieb:
> Daten werden auch nicht kopiert, erst beim Schreiben werden
> sie angelegt.

Das stimmt auch nicht. Wie sollte das funktionieren?

Das Alloziieren des Speichers passiert immer vor dem Aufruf des 
Konstruktor und damit immer vor dem Aufruf irgend einer anderen 
Funktion. Entweder der Konstruktor initialisiert einen member oder 
nicht. Da wird aber nichts angelegt und schon garnicht gibt es irgend 
einen Mechanismus, der auf schreibende Zugriffe triggert um dann "Daten" 
"anzulegen".

Es ist wirklich viel einfacher als man denkt. Die Klasse ist die 
Vorlage für ein Objekt. Ich kann auch ein Objekt initial mit dem 
Inhalt eines anderen Objekts erzeuge. Dann spricht man auch von Kopie 
(Kopier-Konstruktor).

1
class A {};
2
3
A a; // a ist eine Instanz von A; es wird überhauptnix kopiert
4
A b( a ); // b ist eine Instanz von A und eine Kopie von a;

von A. H. (ah8)


Lesenswert?

chris schrieb:
> Dr. Sommer schrieb:
>> Man kann eine Klasse nicht "aufrufen" oder "erzeugen". Man kann
>> höchstens Instanzen einer Klasse anlegen.
>
> Doch. Eine Instanz "erzeugt" eine Kopie der Klasse im Hauptspeicher. Die
> Instanz verweist dann anschließend auf den Adressbereich.

In C++ ist eine Klasse ein Datentype, eine Instanz einer Klasse ein 
Datenobjekt. Datenobjekte kann man zur Laufzeit anlegen, kopieren und 
löschen, mit Datentypen geht das nicht. Datentypen sind in einer 
statisch getypten Sprache wie C++, wie der Name schon sagt, statisch. 
Datentypen kann nur der Programmiere im Quelltext definieren. Darüber 
hinaus kann in gewissem Umfang der Compiler Datentypen herleiten, zum 
Beispiel durch Template-Instanziierung. Das geschieht aber immer zur 
Compile-Zeit, niemals zur Laufzeit.

von Markus (Gast)


Lesenswert?

Fritz Ganter schrieb:
> So schlimm ist es auch nicht,
Instanziieren ist keine Frage von gut oder schlecht sondern eine Frage 
der Notwendigkeit. Brauche ich Instanzen, erzeuge ich sie. Brauche ich 
sie nicht, erzeuge ich sie nicht. Ist doch genauso wie mit Parametern, 
lokalen Variablen etc. Brauche ich sie, lege ich sie auch an.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.