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
In OOP Sprachen ist es ganz normal Objekte zu erstellen.
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.
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.
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...
Und pass auf mit new und delete falls du dynamische Istanzen erstellst.
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).
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
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?
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.
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
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.
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?
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
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?
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.
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
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
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.
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
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; |
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.