2017-08-26 9 views
1
#include<iostream> 
using namespace std; 

class Prac{ 
     string ch; 
     public: 
    void getstring(string g) 
      { 
      ch=g; 
      return; 
      } 
     }; 
int main() 
{ 
    Prac obj1; 
    Prac obj2; 
    string str1; 
    cout<<"Enter string for object 1"<<endl; 
    getline(cin,str1); 
    obj.getstring(str1); 
    cout<<sizeof(obj1)<<endl; 
    cout<<sizeof(obj2)<<endl; 
    return 0; 
} 

Wir wissen, dass die Größe des Objekts die Gesamtgröße der darin enthaltenen Datenelemente ist. Hier für das obj1 fügen wir einen Wert für die String-Variable ein und für obj2 lassen wir es leer. Warum gibt es keinen Unterschied in der Ausgabe (Größe der Objekte)?Größe eines Objekts in C++

+2

"Wir wissen, dass die Größe des Objekts die Gesamtgröße der darin enthaltenen Datenelemente ist." - Nein, das ist nicht wahr. "Warum wird es keinen Unterschied in der Ausgabe geben" - weil die Größe des Objekts nicht von den darin gespeicherten Daten abhängt. – AnT

+0

'std :: string' enthält dynamisch zugewiesenen Speicher, der nicht von' sizeof' gezählt wird – SurvivalMachine

Antwort

0

Zunächst in C++ - Objektgrößen werden zur Laufzeit bestimmt. Daher kann die Größe zur Laufzeit nicht geändert werden. Sizeof gibt tatsächlich die Größe des Typs zurück. Alle Objekte desselben Typs haben dieselbe Größe, nach dem Sprachdesign.

Dann Padding, ungenutzte Bytes zwischen den Mitgliedern, so dass die Größe eines Typs tatsächlich ein bisschen größer als nur die Größe aller Mitglieder sein kann.

Aber um Ihre eigentliche Frage zu beantworten: Daten variabler Länge sind nicht im Objekt selbst gespeichert. Der Speicher dafür wird separat zugewiesen, und das Objekt speichert nur einen Zeiger auf zugeordnete Daten.

0

Nun, wie Sie gesagt haben, ist die Größe eines Objekts (ungefähr) die Größe aller seiner Mitglieder kombiniert.

Aber Sie können nicht neue Mitglieder zur Laufzeit hinzufügen können Sie?

Nein. Die Größe eines Objekts ist eine Kompilierzeiteigenschaft eines Typs. Wenn die Größe Ihres Objekts 24 ist, wird es sich nie ändern, egal welchen Wert Sie darin eingeben!

Es ist wie erwartet, dass die Größe eines int größer wird, wenn Sie ihm einen großen Wert zuweisen. Nein, die Größe ist gleich, aber der Wert ist unterschiedlich.

Dies ist in etwa das gleiche passiert hier. Sie haben eine Klasse, die eine std::string enthält. Ein String enthält eine Kapazität, eine Größe und einen Zeiger auf die String-Daten. Wenn Sie diesen Werten einen Wert zuweisen, wird die Größe Ihrer Struktur nicht geändert.

Die Sache, die in der Größe geändert wird, ist die Größe des zugeteilten Puffers, auf den Ihre Schnur zeigt. Dies ändert jedoch nicht die Größe der Klasse std::string.

Verwandte Themen