Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

1

24.10.2006, 18:35

[C++] Frage zu Speicher und Objekten!

Ich habe mir grad was überlegt.
Und zwar nutze ich für meine Engine 2 singletonfunktionen.
Die eine liefert eine Referenz und die zweite einen Zeiger.

Wen ich nun z.b. 50 Objekte im ganzen Programm habe aber alle mit den Singletons arbeiten, wird dann mehr oder genauso viel Speicher genutzt wie bei einer globalen Variable?

Theoretisch müsste es genausoviel sein da ja dann die Addresse des Singletonsobjekts/Zeigers übernommen wird oder?
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

Anonymous

unregistriert

2

24.10.2006, 18:41

Ich glaube Du solltest noch etwas die Basics durchstöbern.

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

3

24.10.2006, 19:29

hmm okay mal schauen!
Den ich möchte Globales(Selbst für die Engine) vermeiden!!!
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

rewb0rn

Supermoderator

Beiträge: 2 773

Wohnort: Berlin

Beruf: Indie Game Dev

  • Private Nachricht senden

4

24.10.2006, 19:38

Der Speicher den dein Programm zusaetzlich verbraucht wenn du mit Singletons anstelle von globalen Variablen arbeitest ist vernachlaessigbar, du musst dir da keine Gedanken drueber machen, das wirst du nicht merken.
Singletons haben zusaetzlich noch den Vorteil, dass der Speicher deines Objektes erst dann reserviert wird, wenn du es zum ersten Mal brauchst und nicht so wie bei globalen Variablen bei Programmstart.

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

5

24.10.2006, 20:01

Okay das weiß ich ja schon ;)
Aber die frage ist->Wenn ich ein Objekt erstelle verbraucht es ja erstmal eigenen Speicher, aber wenn es dann den Wert von dem Singleton bekommt sollte der alte Speicher wieder frei sein oder wird der weiterhin genutzt?
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

6

24.10.2006, 20:02

Unter den Vorraussetzungen, wie du das beschreibst, macht es gar keinen Unterschied, ob du nun Singletons oder globale Variablen nutzt. (eigentlich müsste der Singleton um einen Zeiger weniger Speicher verbrauchen, jedenfalls wenn es ein komplexes Objekt ist und der Singleton ordentlich implementiert ist :))

Die Idee hinter einem Singleton ist ja eben (genau wie bei einer globalen Variablen), dass es das Objekt nur genau einmal gibt. Wie oft das dann refrenziert wird, ist völlig egal.

Und um dir mal jegliche Illusion zu rauben: Singletons sind das objektorientierte (*hüstel*) Gegenstück zu einer globalen Variablen. So kommst du deinem Vorsatz also wirklich nicht näher. ;)

Sonst kann ich unsigned long nur zustimmen.

[edit] Oh, wenn ich deinen letzen Post richtig gelesen habe, willst du die die gelieferte Referenz / den gelieferten Zeiger auf deinen Singleton in den Objekten merken. Dann verbrauchst du in beiden Fällen pro Objekt einen Zeiger (c.a. 4 Byte :p) Aber, warum wollte man sowas machen?

Gruss,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

7

24.10.2006, 20:08

Ich weiss nicht ob es dir klar ist, ein Singleton ist ein Objekt, das genau nur einmal vorhanden ist. Es gibt sehr verschiedene Ansätze, z.B. mit Guards etc. hier ist mal ein recht einfacher Ansatz. Es wird ein Engine Objekt erzeugt, erst wenn du die Methode instance benutzt.
Ich stimme aber auch ULong zu, genauso wie rklaffehn

So in etwa:


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Engine
{
public:
   static Engine& instance()
   {
      static Engine _instance;
      return _instance;
   }
   ~Engine();
   void xyz();
private:
   Engine();           // verhindert, das ein Objekt von außerhalb von N erzeugt wird.

                   // protected, wenn man von der Klasse noch erben möchte

   Engine( const Engine& ); /* verhindert, dass eine weitere Instanz via
Kopie-Konstruktor erstellt werden kann */
};

void Engine::xyz() { printf("hallo"); }
Engine::~Engine() {}
Engine::Engine() {}

* Quelle: http://de.wikibooks.org/wiki/C++-Programmierung:_Entwurfsmuster:_Singleton

C-/C++-Quelltext

1
2
    // engine Obj manipulieren

    Engine::instance().xyz();

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

8

24.10.2006, 20:22

Okay ich zeig euch mal wie ich das zusammen gewürfelt habe ;)

//Eine kurzfassung meiner Engineklasse:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class CMDGEngine
{
 public:
 //...Hier stehen lauter methode!

}

//Singletons für die Engineklasse:

CMDGEngine& GetEngineRef()
{
 static CMDGEngine EngineObj;
 return EngineObj;
}

CMDGEngine* GetEnginePtr()
{
 static CMDGEngine* pEngine=GetEngineRef();
 return pEngine;
}


So sieht das aus(Ich weiß es ist nicht professionell aber das optimieren wollt noch ;)

Hier ein Beispiel für meine Frage:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//Eine weitere Funktion in der mit der Engine gearbeitet wird:

void SomeFunc();

//Hier wird in Main erstmal ein Objekt erstellt:

int main()
{
 CMDGEngine NewObj=GetEngineRef();
 SomeFunc();
}

void SomeFunc()
{
 CMDGEngine EngObj=GetEngineRef();
}


Wird nun durch das erstellen der 2 Objekte mehr oder gleichviel Speicher gebraucht?

Da eigentlich für jedes Objekt neuer Speicher gerufen wird (mehr) aber da ich immer wieder durch das Singleton auf einen bestimmten Speicher zeige(gleich viel) oder?
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

9

24.10.2006, 21:03

Ah, nun ist das klarer.

Eigentlich ist es Unsinn, zwei Methoden zu haben, um eine Instanz zu bekommen. Uneigentlich ist das auch Unsinn! Entweder du benutzt immer eine Referenz oder immer einen Zeiger. Mal das eine und dann wieder das andere braucht man nicht.

Sonst hat dein Singleton einen fundamentalen Fehler; man kann ihn kopieren, was gegen das Singleton-Pattern verstößt. Wenn man darauf nicht achtet, funktioniert das hier (so machst du das eben):

C-/C++-Quelltext

1
CMDGEngine NewObj = CMDGEngine::GetEngineRef (); /* Ieeks! Kopie... */


Richtig wäre aber folgendes:

C-/C++-Quelltext

1
2
3
CMDGEngine* engine_ptr = CMDGEngine::GetEnginePtr (); /* Zeiger merken */
/* oder */
CMDGEngine& engine_ref = CMDGEngine::GetEngineRef (); /* Referenz merken */


Beide Versionen merken sich nur einen Zeiger auf das Engine Objekt und es wird nichts kopiert.

Wenn man unbedingt kopieren will... ach nee. Singletons will man nicht kopieren! (eine Kopie belegt natürlich wieder soviel neuen Speicher wie das Original, egal was man so kopiert)

Wie verhindert man, dass ein Singleton kopiert werden kann? Ganz einfach:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
class Singleton
{
  private:

    Singleton ();
    Singleton (const Singleton&);
    Singleton& operator = (const Singleton&);

  public:

    static Singleton& getInstance ();
};


Bis auf den Default-Konstruktor musst du nichtmal was implementieren.

Fazit: Singleton-Pattern nicht verstanden. Setzen, 6. :roll:

[Edit] Zum "nicht kopieren können" siehe auch den Post von Koschka. Hatte den Kommentar überlesen.

Gruss,
Rainer
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

T-VIRUS

Alter Hase

  • »T-VIRUS« ist der Autor dieses Themas

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

10

24.10.2006, 21:09

kay danke für die aufklärung ;)
Aber ich arbeite auch nicht lange mit Singletons und habe auch wenige Informationsquellen atm darüber.
Aber ich werde mal sehen aber ich nicht doch die Methoden version nutzen werde ;)

Ich werd erstmal mit den Singletons exerimentieren =)
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

Werbeanzeige