Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 27.01.2008, 12:45 Titel: class vs. struct |
|
|
Hi, ich hab da mal ein kleines Verständnisproblem:
Man kann ja in einer struct genauso methoden deklarieren wie in einer class. Was ist denn da dann eigentlich der große Unterschied zwischen structs und classes ?? Außer dass ein ein struct nicht zwangsläufig nen constructer bzw. destructer haben muss.
Nebenbei : Wenn ich jetzt ca 200 Instancen vom gleichen Object haben will. Ist es dann sinnvoller diese als structs oder als class zu definieren ?
Wie sieht es da mit dem Speicherverbrauch aus ?
Was ist sinvoller ?
CPP: | struct DefaultStruct{
public:
DefaultStruct();
virtual ~DefaultStruct();
void SetBla(int wert);
int GetBla();
...
void MachMalWas();
protected:
int bla;
int blu;
};
class StructManager{
public:
StructManager();
virtual ~StructManager();
void AddDefaultStruct(int ID, int bla, int blu);
DefaultStruct* GetDefaultStructPtr(int ID)
protected:
std::map<int , DefaultStruct>DefaultStructMap;
};
|
oder das :
CPP: | class DefaultClass{
public:
DefaultClass();
virtual ~DefaultClass();
void SetBla(int wert);
int GetBla();
...
void MachMalWas();
protected:
int bla;
int blu;
};
class ClassManager{
public:
ClassManager();
virtual ~ClassManager();
void AddDefaultClass(int ID, int bla, int blu);
DefaultClass* GetDefaultClassPtr(int ID)
protected:
std::map<int , DefaultClass>DefaultClassMap;
};
|
oder wär ses sogar besser die methoden der ersten structs bzw classes in den jeweiligen Manager auszulagern, damit diese nicht 100-fach im RAM schlummern?
Auf dass mir jemand die Erleuchtung bringen möge.
mfg Matthias
Zuletzt bearbeitet von Otscho am 27.01.2008, 12:52, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 27.01.2008, 12:52 Titel: |
|
|
In C++ ist der unterschied das class per default private und struct public ist.
In C# gibt es da noch weitere deutliche unterschiede aber in C++ gibt es nur diesen unterschied, dennoch halte zumindest ich es für guten Stil wichtiges mit Methoden, etc als class zu halten und anderes wie zb nur Membervariablen in structs zu halten.
Zitat: | Nebenbei : Wenn ich jetzt ca 200 Instancen vom gleichen Object haben will. Ist es dann sinnvoller diese als structs oder als class zu definieren ?
Wie sieht es da mit dem Speicherverbrauch aus ? |
Gibt keinen Unterschied. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 27.01.2008, 12:57 Titel: |
|
|
Ah ok.
Dann sind die also "fast" gleich zu behandeln.
Zum Edit meiner Frage:
Wüdest du nun versuchen nur die variablen in einer struct/class zu speicher oder auhc dei ganzen methoden dazu die diese variuablen verwenden ?
Oder konkret: Wenn du ne Klasse für ein sprite hast und davon hunderte instancen in ner Managerklasse gespeichert hast. Würdest du dann z.B. die Rendermethode in der struct oder in dem Manager schreiben ? |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 27.01.2008, 14:49 Titel: |
|
|
Also ich mach das so:
Ich benutze Strukturen eigentlich, wenn ich zusammenhängende Daten bündeln will. Die kriegen dann manchmal noch Konstruktoren um Standardwerte zu setzen. Allerdings nie Methoden. Die Elemente sind daher alle public, und man kann von außen darauf zugreifen.
Bei Klassen sind Member immer privat, es sei den bei sowas wie Vectorklassen, wo man ja von außen schnell darauf zugreifen will. _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 27.01.2008, 17:18 Titel: |
|
|
Otscho hat Folgendes geschrieben: | Ah ok.
Dann sind die also "fast" gleich zu behandeln.
Zum Edit meiner Frage:
Wüdest du nun versuchen nur die variablen in einer struct/class zu speicher oder auhc dei ganzen methoden dazu die diese variuablen verwenden ?
Oder konkret: Wenn du ne Klasse für ein sprite hast und davon hunderte instancen in ner Managerklasse gespeichert hast. Würdest du dann z.B. die Rendermethode in der struct oder in dem Manager schreiben ? |
Wenn du ohne VTables arbeitest sollte der Overhead an Speicherverbrauch durch die einzelnen Methoden in der Klasse/struct bei nur ein par hunderten nicht zu extrem sein, bei VTables hast du praktisch sowieso nur einmal den verbrauch für die Methoden, egal wie viele Instanzen du davon erstellst.
Das ganze ist also eher eine Entwurfsmuster Frage. Ichpersönlich würde der Managerklasse sowie den einzelnen Spriteklassen eine Rendermethode geben. so kannst du recht flexibel neue Verhaltensmuster erzeugen indem du zB eine Ableitung der Spriteklasse erstellst und die Rendermethode überlädst.
Edit:
@Jonathan: Vektorklassen? _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Jonathan_Klein Living Legend
Alter: 37 Anmeldedatum: 17.02.2003 Beiträge: 3433 Wohnort: Siegerland Medaillen: Keine
|
Verfasst am: 27.01.2008, 17:20 Titel: |
|
|
äh, mathematische Vektoren. Sowas mit x, y oder x, y, z.
Die Vektoren, die man mit Matrizen multipliziert (oder gings nur andersherum? naja, egal ). _________________ https://jonathank.de/games/ |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 27.01.2008, 18:20 Titel: |
|
|
Sowas lässt sich in C# so schön abbilden aber unter C++ habe ich das auch schon gesehen das man setter und getter erstellen kann wenn man eine Membervariable ändern möchte (war unter dem Borland C++ Builder) jemand ne Idee wie das da gemacht wurde? _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Otscho Super JLI'ler
Alter: 36 Anmeldedatum: 31.08.2006 Beiträge: 338 Wohnort: Gummibären-Gasse Medaillen: Keine
|
Verfasst am: 27.01.2008, 19:17 Titel: |
|
|
Fallen hat Folgendes geschrieben: | Wenn du ohne VTables arbeitest sollte der Overhead an Speicherverbrauch durch die einzelnen Methoden in der Klasse/struct bei nur ein par hunderten nicht zu extrem sein, bei VTables hast du praktisch sowieso nur einmal den verbrauch für die Methoden, egal wie viele Instanzen du davon erstellst. |
Dann bin ich ja beruhigt
Also einfach beim Deklarieren ein virtual vorne hinsetzen, dann muss man sich um einen unnötigen Speicherverschleiß in der Beziehung keine Sorgen machen ? |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 28.01.2008, 12:29 Titel: |
|
|
struct kommt (wie union) aus C, d.h. es ist in erster Linie aus Grund der Kompatibilität beibehalten worden. Dabei hat man sie aber noch erweitert (z.B. spart man sich jetzt das typedef davor) und gleich noch Klasseneigenschaften hinzugefügt. Für einen guten Stil solltest du sie so benutzen wie Fallen und Jona das schon gesagt haben. Das siehst du schon am default-Access:
class default: private zugriff durch Methoden
struct default: public zugriff direkt
Die Sache mit den Constructoren z.B. hat man für structs wegen der Einfachheit zugefügt, z.B.: CPP: | // in C
typedef struct _foo1
{
int i;
bool b;
} foo1;
foo1 var1 = { 0, true };
// in C++
struct foo2
{
foo2( int _i = 0, bool _b = true ) : i(_i), b(_b) {}
int i;
bool b;
};
foo2 var2; // automatisch mit 0 und true instanziert
var2 = foo2( 2, false ); // durch den Konstruktor lesbar neuzugewiesen
foo2 var3( 3 ); // automatisch mit 3 und (default) true erzeugen |
Gruß DXer |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 28.01.2008, 12:35 Titel: |
|
|
Der Unterschied ist doch ganz klar - Er liegt im Speicherhandling:
Ein Struct ist ein WertTyp, was bedeutet, eine Instanz wird auf dem Stack abgelegt.
Eine Class ist ein VerweisTyp, was bedeutet sie wird mit new instanziiert und liegt damit im Heap.
man kann ein Struct auch als Verweistyp mit new erstellen, genauso wie man eine Klasse auf Stack legen kann - jedoch sind dies eher die Ausnahmen _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
Deviloper Junior JLI'ler
Anmeldedatum: 31.05.2006 Beiträge: 77
Medaillen: Keine
|
Verfasst am: 28.01.2008, 14:41 Titel: |
|
|
? Hab nciht alles verstanden was du uns damit sagen willst. Aber es gibt defacto keinen Unterschied, mit Ausnahme der Zugriffrechte, zwischen class und struct in C++. Beide liegen auf dem Stack, solange du nicht hingehst und durch dynamische Speicheranforderung (new, new[]) sie auf den Heap legst. |
|
Nach oben |
|
|
DirectXer Dark JLI'ler
Anmeldedatum: 05.02.2005 Beiträge: 1201 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 29.01.2008, 09:05 Titel: |
|
|
AFE-GmdG hat Folgendes geschrieben: | Der Unterschied ist doch ganz klar - Er liegt im Speicherhandling:
Ein Struct ist ein WertTyp, was bedeutet, eine Instanz wird auf dem Stack abgelegt.
Eine Class ist ein VerweisTyp, was bedeutet sie wird mit new instanziiert und liegt damit im Heap.
man kann ein Struct auch als Verweistyp mit new erstellen, genauso wie man eine Klasse auf Stack legen kann - jedoch sind dies eher die Ausnahmen |
Das kann man so nicht sagen, machst du z.B. sowas? CPP: | std::map< std::string*, int>* m = new std::map<std::string, int>();
map[ new std::string() ] = 0; | Bestimmt nicht, trotzdem sind beides Klassen. Es ist auch im Grunde kein guter Stil, jede Klasse auf dem Heap auzulegen (vor allem weil man ständig mit pointern arbeiten muss). Das kommt immer auf den Verwendungszweck an. Von Grund auf gibt es nur diesen einzigen Default-Access-Unterschied zwischen public und private.
Gruß DXer |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 29.01.2008, 18:36 Titel: |
|
|
@AFE-GmdG: Bezieht sich deine Antwort nicht eher auf C#? _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
AFE-GmdG JLI MVP
Alter: 45 Anmeldedatum: 19.07.2002 Beiträge: 1374 Wohnort: Irgendwo im Universum... Medaillen: Keine
|
Verfasst am: 30.01.2008, 08:46 Titel: |
|
|
Fallen hat Folgendes geschrieben: | @AFE-GmdG: Bezieht sich deine Antwort nicht eher auf C#? | Dort Trifft es noch viel deutlicher zu - ja.
Aber auch in C++ sollten imho Kassen und Strukturen wie oben beschrieben verwendet werden. _________________
CPP: | float o=0.075,h=1.5,T,r,O,l,I;int _,L=80,s=3200;main(){for(;s%L||
(h-=o,T= -2),s;4 -(r=O*O)<(l=I*I)|++ _==L&&write(1,(--s%L?_<(L)?--_
%6:6:7)+\"World! \\n\",1)&&(O=I=l=_=r=0,T+=o /2))O=I*2*O+h,I=l+T-r;} |
|
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 30.01.2008, 09:56 Titel: |
|
|
Dort ist es aber eine Stilfrage, optimiert wird dadurch ja kaum etwas, es sei denn du hast in deiner Klasse soviel Material das dadurch der ganze Stack überfüllt wird, aber sowas sollte so gut wie nie auftreten.
Wie DirectXer auch schon anmerkte tut man das mit den ganzen STL Klassen ja auch nicht. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
|