Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Struct vs. Class

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
27.06.2005, 14:28 Uhr
Macoy



Hi,

Was ist eigentlich der Unterschied zwischen den beiden Arten hinsichtlich Speicherverbrauch / Effizienz ?


Mein konkretes Anwendungsbeispiel:


C++:
struct Vec3f
{
    public:
        float X;
        float Y;
        float Z;
        
        Vec3f(float x, float y, float z);    
};





C++:
class Vec3f
{
    public:
        float X;
        float Y;
        float Z;
        
        Vec3f(float x, float y, float z);    
};

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.06.2005, 14:39 Uhr
Pablo
Supertux
(Operator)


Ich bin nicht ganz fit in C++, aber ich denke, ich kann mich erinnern, dass structs Klassen sind, deren Members standardmäßig auf 'public:' gesetzt werden. Demnach sollte es dann keinen Unterschied geben (denke ich mal)
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.06.2005, 15:05 Uhr
Macoy



Nun ja, ich komme eher aus der Java-Ecke und da sollte man aus Gründen der Speicherbelastung/Performance davon absehen, fuer jede kleine Datenmenge eine Klasse zu entwerfen, da der Verwaltungaufwand für eine Klasse sehr gross ist.

Daher wüsste ich gern, wie es mit dem Verwaltungsaufwand für eine Klasse in C++ aussieht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
27.06.2005, 16:01 Uhr
virtual
Sexiest Bit alive
(Operator)


Also erstmal hat pablo recht: struct/class macht nur Unterschied hinsichtlich des Default protection levels.

Was den Aufwand angeht:
Anders als in Java hast Du hier ja schon mal ein völlig anderes Klassen konzept. zB gibt es in Java nicht wirklich die Unterscheidung zwischen virtuellen und nicht virtuellen Funktionen, in C++ schon. Und dann gibt es in C++ aj auch noch die Mehrfachvererbung. Also:

Generell ist es so, daß eine Klasse/Struktur größer oder gleich der Summe der größe ihrer Komponenten ist. zB folgende Struktur:

Code:
struct demo {
   char a;
   char b;
   char c;
};


Die Größe dieser Struktur ( mit "sizeof(demo)" bestimmbar) ist garantiert >3, obwohl die einzelnen Felder zusammen ja nur 3 Byte ausmachen (char ist in C 1 Byte groß. Immer.)
Wenn ich also im folgenden von dem platzbedarf der Felder rede, dann stets von der "aligned size", also dem Bedarf, den die Struktur/Klasse ohne Methoden haben würde.

Statische Felder benötigen keinen Speicher pro instanz, sondern nur einmalig, weil die ja auch nur einmal im System angelegt werden

Bei Klassen ohne virtuelle Methoden ist der Platzbedarf einer Klasse mit methoden so groß wie die Aligned size. Allerdings sollte man berücksichtigen, daß Klassen ohne virtuelle Methoden auch keinen virtuellen Destruktor haben dürfen und damit nicht ableitbar sind (ist nicht schlimm, weil in C++ weniger stark abgeleitet wird als in Java, dafür gibt es ja hier ein ziemlich geiles Templatekonzept, was bedeutend flexibler als das von Java ist).

Bei einer Klasse mit mindestens einer virtuellen methode (implizit damit auch allen einfach angeleiteten Klassen) ann man meist von einem zusätzlichen bedarf von sizeof(void*) Bytes (also meist 4 oder 8 Bytes) ausgehen.

Bei mehrfachvererbung steigt der Platzbedarf ziemlich Platformabh. und in abh. der Art der vererbung (virtuelle Vererbung oder nicht). Pi mal Daumen rechne halt 4-8 zusätzliche Byte pro direkter Basisklasse.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
27.06.2005, 16:54 Uhr
(un)wissender
Niveauwart



Zitat von virtual:

Allerdings sollte man berücksichtigen, daß Klassen ohne virtuelle Methoden auch keinen virtuellen Destruktor haben dürfen[...]



Seit wann gilt das denn (bspw. tut Andrei Alexandrescu genau das in "Modernes C++ Design" bei seinem Entwurf des SmallObjectAllocators)?


Bearbeitung:

Nochwas zur Klassengröße von Klassen, die eine oder mehere Methoden virtuell haben. Dort gibt es dann auch die RTTI-Sachen, was zu einer Vergrößerung der Klassendaten, aber nicht der Objektdaten führt.
Das gilt aber, glaube ich, auch für structs.


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 27.06.2005 um 16:56 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
27.06.2005, 17:20 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


wenn man viele objekte halt (sagen wir mal 10000stk) dann sind doch structs theoretisch schneller? weil ja nicht dann pro element der konstruktor ausgeführt wird, oder irre ich mich?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
27.06.2005, 18:34 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von (un)wissender:

Zitat:

Allerdings sollte man berücksichtigen, daß Klassen ohne virtuelle Methoden auch keinen virtuellen Destruktor haben dürfen[...]



Seit wann gilt das denn (bspw. tut Andrei Alexandrescu genau das in "Modernes C++ Design" bei seinem Entwurf des SmallObjectAllocators)?


Habe ich vielleicht nicht klar ausgedrückt:
Wenn eine Klasse einen virtuellen dtor hat, so stellt die Klasse eine Klasse dar, welche eine virtuelle Method (nämlich den dtor) hat. Damit also eine Klasse überhaupt keine virtuellen methoden hat (denn nur so kann verhindert werden, daß sie eine VMT bekommt), darf sie trivialerweise auch keinen virtuellen dtor haben.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 27.06.2005 um 18:49 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
27.06.2005, 18:54 Uhr
(un)wissender
Niveauwart


, dann macht deine Aussage so auch gar keinen Sinn. Wie soll den eine Klasse ohne virtuelle Methoden einen virtuellen Destruktor haben, wenn du Destruktoren zu Methoden zählst (ist ja auch eine).
Na ja, ist auch egal, ich weiß was du meinst.

@Flosoft
Kommt drauf an, ist das gleiche wie bei Klassen. Wenn ein Konstuktor definiert ist (ein andere als der Default, der ist immer da), dann wird der ausgeführt. Da tun sich klassen und structs nichts.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
27.06.2005, 20:36 Uhr
Pler
Einer von Vielen
(Operator)


Hab noch nie ne Struktur mit Konstrucktor gesehen?
geht da so was:

C++:
int main()
{
  strukt struktname
    mystrukt;

  printf( "%s" , mystrukt.gibWert() );

  return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
27.06.2005, 21:51 Uhr
ao

(Operator)



Zitat von FloSoft:
wenn man viele objekte halt dann sind doch structs theoretisch schneller? weil ja nicht dann pro element der konstruktor ausgeführt wird

Auch structs können Konstruktoren haben. Der einzige Unterschied zwischen struct und class ist der von Pablo genannte. Der folgende Code ist mit jedem der beiden #define-Anweisungen übersetzbar:

C++:
#define X struct
//#define X class

X x
{
private:
    int N;
    
public:
    x(int n)
    : N (n)
    {
    }
};

int main(int argc, char *argv[])
{
    x ix (5);

    return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: