mikrocontroller.net

Forum: PC-Programmierung Größe eines Objektes


Autor: Ampfing (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe ein MFC-DLL-Projekt hier. Dort gibt es eine Klasse mit 
folgender Definition:
class CTsp
{
   public:
      // configuration structure
      typedef struct
      {
         int            iAnzSpur;            // Anzahl der verhandenen Spuren
         CSpur*         pSpur[2];            // Spuren
         CWidthAdjust*  pWidthAdjust;        // width adjust unit
         CTspBoard*     pBoard;              // Transportsteuerung
      } ConfTsp;

      // interface functions
      CTsp(const ConfTsp *pConf);
      virtual ~CTsp();
      
      // public members
      CLp     m_LpTyp[5]; 
      CSpur * m_pSpur[2];

   private:
      // private functions
      void GetHole(LPCSTR key, unsigned char p_loecher[], int buffer_len); 

      // members
      const ConfTsp*    m_pConf;
      bool              m_bUpdateReady;
      bool              m_bSteuerspannung;
      bool              m_bInitOk; 
      bool              m_bAktualisieren;
      int               m_iAnzSpur;
};

Jetzt wird ein Objekt dieser Klasse angelegt, anschließend möchte ich 
per sizeof die Größe dieses Objekts ermitteln. Sizeof gibt mir einen 
Wert von 1624 zurück.
Das würde ja bedeuten, dass das Objekt knapp 1,6 kB braucht! Wie kommt 
das denn bitteschön?
Wenn ich das mal grob im Kopf überschlage komme ich auf:
      // public members
      CLp     m_LpTyp[5];     // 5*4 Bytes = 20 Bytes
      CSpur * m_pSpur[2];     // 2*4 Bytes = 8 Bytes
      // members
      const ConfTsp*    m_pConf;            // 4 Bytes
      bool              m_bUpdateReady;     // ?? ich rechne mal mit 4 Bytes
      bool              m_bSteuerspannung;  // ?? ich rechne mal mit 4 Bytes
      bool              m_bInitOk;          // ?? ich rechne mal mit 4 Bytes
      bool              m_bAktualisieren;   // ?? ich rechne mal mit 4 Bytes
      int               m_iAnzSpur;         // 4 Bytes
Das macht bei mir in Summe 84 Bytes und nicht 1624! Wo sind bitte die 
1540 Bytes, die das Objekt zusätzlich braucht versteckt? Doch nicht 
etwas in den Member-Funktionen, oder? Da gibt es ein paar (ca. 10 an der 
Zahl), aber die kann er doch nicht bei jedem Objekt anlegen müssen, 
oder? Wenn mich nicht alles täuscht legt er die Funktionen an und 
verweißt dann bei den entsprechenden Objekten per Tabelle drauf, oder? 
Das wären dann nochmal 40 Bytes (bei 10 Funktionen und 4 Bytes pro 
Pointer).

Kann mir jemand erklären, wieso das Objekt dermaßen groß ist?

Ach ja, ich weiß dass es nicht toll ist öffentliche Member-Variablen zu 
haben, die werde ich auch noch beseitigen.

Vielen Dank fürs lesen und viele Grüße

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>       CLp     m_LpTyp[5];     // 5*4 Bytes = 20 Bytes

Das sind keine Pointer! Daher dürfte die Größe eines solchen Objektes 
deutlich größer sein.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ampfing schrieb:

> 1540 Bytes, die das Objekt zusätzlich braucht versteckt? Doch nicht
> etwas in den Member-Funktionen, oder?

Nein.

> Da gibt es ein paar (ca. 10 an der
> Zahl), aber die kann er doch nicht bei jedem Objekt anlegen müssen,
> oder? Wenn mich nicht alles täuscht legt er die Funktionen an und
> verweißt dann bei den entsprechenden Objekten per Tabelle drauf, oder?

Auch nicht.
Das einzige was zu der sizeof des Objektes beiträgt sind virtuelle 
Funktionen. Und das auch nur in Form eines Pointers, dem sog. V-Table 
Pointer. Ob du also 1 virtuelle Funktion hast oder 20 spielt für ein 
einzelnes Objekt keine Rolle. Es gibt zwar irgendwo im Speicher die 
V-Table für diese Klasse die mit jeder virtuellen Funktion größer wird, 
aber diese V-Table existiert nur einmal für alle Objekte die von dieser 
Klasse erzeugt werden.

Die sizeof wird mehr oder weniger ausschliesslich von 3 (4) Faktoren 
bestimmt:
* Von welche Klassen eine Klasse abgeleitet wurde
* Welche Member eine Klasse hat
* Alignmentanforderungen der Member und damit zusätzliche Padding Bytes
* (Die sizeof kann nicht 0 sein)

Autor: Ampfing (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

@Rufus t. Firefly
Oh Mann, da hatte ich nen Stern gesehen, wo keiner ist... Danke! Dann 
werd ich mal versuchen zu finden, warum hier keine Pointer verwendet 
werden...

@Karl heinz Buchegger:
Danke für die Erklärung. Hatte nur noch im Kopf, dass die 
Memberfunktionen über eine Tabelle angesprungen werden. Aber dass das 
nur die virtuellen sind hatte ich nicht gewusst. Macht aber ja auch 
Sinn, da er nur bei denen ja erst zur Laufzeit entscheiden muss, welche 
Funktion er eigentlich wirklich anspringt.

Danke Euch beiden und viele Grüße

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.