2010-10-08 10 views
8
#include<iostream> 
using namespace std; 
class A 
{ 

}; 
class B 
{ 
     public: 
       void disp() 
       { 
         cout<<" This is not virtual function."; 
       } 
}; 
class C 
{ 
     public: 
       virtual void disp() 
       { 
         cout<<"This is virtual function."; 
       } 
}; 
int main() 
{ 
     cout<<"class A"<<sizeof(A)<<endl; 
     cout<<"class B"<<sizeof(B)<<endl; 
     cout<<"class C"<<sizeof(C)<<endl; 
     return 0; 
} 

sizeof Klasse A und Klasse B sind beide 1 Byte only.What über die Speicherzuordnung für Elementfunktion disp in B.Speicherzuordnung für Elementfunktionen in C++

+0

Meinst du, warum es keine Größe hat gleich 1 Byte? –

+0

Wie groß war die Klasse C? – KhanS

+0

Eine viel interessantere Frage sollte sein, warum A und B eine Größe 1 haben anstatt 0 –

Antwort

18

Für jede Instanz der Klasse wird Speicher nur seinem Member Variablen zugewiesen, d. H. Jede Instanz der Klasse erhält keine eigene Kopie der Elementfunktion. Alle Instanzen teilen den gleichen Mitgliedsfunktionscode. Sie können es sich als Compiler vorstellen, indem Sie einen versteckten Zeiger auf für jede Elementfunktion übergeben, damit es auf dem richtigen Objekt funktioniert. In Ihrem Fall, da der C++ - Standard explizit Objekte der Größe 0 verbietet, haben Klasse A und Klasse B die minimal mögliche Größe 1. Im Falle der Klasse C, da es eine virtuelle Funktion gibt, hat jede Instanz der Klasse C einen Zeiger auf ihren v -Tabelle (dies ist jedoch Compiler-spezifisch). Die Größe dieser Klasse wird also sizeof (Zeiger) sein.

+0

Sehr schön gesagt. – JoshD

+0

dies beantwortet auch eine quälende Frage, die ich hatte Thread-Sicherheit - danke – slashmais

+1

@Martin York: Der Standard verbietet Größe 0 Objekte. C++ 03 [Abschnitt '9/3'] sagt' Komplette Objekte und Teilobjekte des Klassentyps müssen eine Größe ungleich Null haben. –

1

Nicht virtuelle Member-Funktionen müssen nicht überall "zugewiesen" werden; Sie können im Wesentlichen als normale Nicht-Klassenfunktionen mit einem impliziten ersten Parameter der Klasseninstanz behandelt werden. Sie fügen der Klassengröße normalerweise nicht hinzu.

0

Nicht virtuelle Funktionen gehören nicht zum Speicher der Klasse. Der Code für die Funktion wird in die ausführbare Datei eingebettet (ähnlich wie bei einem statischen Member), und der Speicher wird beim Aufruf der Variablen zugewiesen. Das Objekt trägt nur die Datenelemente.

1

Die Größe jeder Klasse hängt von der Größe der Variablen in der Klasse und nicht von den Funktionen ab. Funktionen werden nur Speicherplatz auf dem Stapel zugewiesen, wenn sie aufgerufen und bei Rückgabe zurückgegeben. So ist die Größe einer Klasse in der Regel die Summe der Größen der nicht statischen Elementvariablen ...