2013-02-22 11 views
12

I erzeugt eine Klasse X 2 nur öffentlichen Funktionen (und Destruktor) aufweist und unter Verwendung von sizeof Bediener die Klassengröße 1.Wie berechnet der Operator C++ sizeof die Größe?

Wenn ich hinzufügen ein privates Datenelement vom Typ char der obigen Klassendeklaration sein kommt , die Größe ist immer noch 1. Endlich füge ich einen Integer-Typ als Klassendatenelement hinzu, und jetzt ist die Größe 8 Bytes.

Bitte erklären Sie mir, wie eine Klassengröße berechnet wird.

+0

Bitte einen entsprechenden Code schreiben. –

Antwort

23

Zuerst, erkennen, dass Funktionen, die nicht virtuell sind, keinen Einfluss auf die Größe einer Klasse haben.

Die Größe einer Instanz der beliebigen Klasse ist mindestens 1 Byte, auch wenn die Klasse leer ist, so dass verschiedene Objekte unterschiedliche Adressen haben.

Durch das Hinzufügen einer char wird sichergestellt, dass verschiedene Objekte unterschiedliche Adressen haben, sodass der Compiler nicht künstlich zu der Größe hinzufügt. Die Größe ist dann sizeof(char) = 1.

Dann fügen Sie eine int, die (wahrscheinlich) fügt 4 Bytes auf Ihrer Plattform. Der Compiler beschließt dann, die Klasse aufzufüllen, so dass sie aus Leistungs-/CPU-Anforderungsgründen ausgerichtet wird, und fügt 3 leere Bytes hinzu, so dass die Größe jetzt 1 + 3 + 4 = 8 ist. Wahrscheinlich fügt sie das Padding vor dem int-Member hinzu dass es auf einer 4-Byte-Grenze ausgerichtet wird, aber es ist nicht erforderlich, es sei denn, Ihre CPU benötigt es.

Sie können über Padding auf the Wikipedia page lesen.

+2

Ich würde erwarten, dass es "c --- iiii" anstatt "ciiii ---" ist, wie diese Antwort impliziert. – zch

+4

@zch Ich wollte das nicht implizieren, da es am Compiler liegt. Aber ich werde die Reihenfolge der Hinzufügung ändern und eine Notiz hinzufügen, wenn sie es weniger verwirrend erscheinen lässt. –

+0

Vielen Dank @SethCarnegie für die Erklärung. Ich weiß ein wenig über Padding, werde tiefer in es eintauchen, da ich Zweifel habe, warum es keine Auffüllung gibt, wenn nur ein Zeichen deklariert wird, selbst wenn die Grenze 4 Bytes ist. :) – user2100866

8

Es gibt viele Faktoren, die die Größe eines Objekts einer Klasse in C++ bestimmen. Diese Faktoren sind:

  1. Größe aller nicht-statische Datenelemente
  2. Reihenfolge der Datenelemente
  3. Byte Ausrichtung oder Byte padding
  4. Größe seiner unmittelbaren Basisklasse
  5. Die Existenz der virtuellen Funktion (s) (Dynamischer Polymorphismus unter Verwendung von virtuellen Funktionen).
  6. Compiler
  7. Modus der Vererbung (virtuelle Vererbung), die

Sie können mehr verwendet finden hier http://www.cprogramming.com/tutorial/size_of_class_object.html