it-swarm.com.de

C++: Wie groß ist ein Objekt einer leeren Klasse?

Ich habe mich gefragt, was die Größe eines Objekts einer leeren Klasse sein könnte . Es könnte sicherlich not 0 Byte sein, da es möglich sein sollte, darauf zu verweisen und darauf zu verweisen, wie jedes andere Objekt. Aber wie groß ist ein solcher Gegenstand?

Ich habe dieses kleine Programm benutzt:

#include <iostream>
using namespace std;

class Empty {};

int main()
{
    Empty e;
    cerr << sizeof(e) << endl;
    return 0;
}

Die Ausgabe, die ich auf Visual C++ - und Cygwin-g ++ - Compilern erhielt, war 1 Byte ! Dies war ein wenig überraschend für mich, da ich erwartet hatte, dass es die Größe des Maschinenworts (32 Bit oder 4 Bytes) hat.

Kann jemand warum die Größe von 1 Byte erklären? Warum nicht 4 Bytes? Ist das auch vom Compiler oder der Maschine abhängig? Kann auch jemand einen zwingenden Grund dafür nennen, warum ein leeres Klassenobjekt nicht eine Größe von 0 Bytes hat?

96
Ashwin Nanjappa

Zitieren Bjarne Stroustrup's C++ - Stil und -Technik FAQ , der Grund, warum die Größe nicht Null ist, ist "Um sicherzustellen, dass die Adressen zweier verschiedener Objekte unterschiedlich sind." Und die Größe kann 1 sein, da hier die Ausrichtung keine Rolle spielt, da es nichts zu sehen gibt.

115
Sol

Der Standard besagt, dass alle am meisten abgeleiteten Objekte sizeof ()> = 1 haben:

Wenn es sich nicht um ein Bitfeld (class.bit) handelt, muss das am meisten abgeleitete Objekt eine Größe ungleich Null haben und ein oder mehrere Bytes Speicher beanspruchen. Basisklassen-Unterobjekte können eine Größe von null haben. ISO/IEC FDIS 14882: 1998 (E) intro.object

29
TrayMan

Das ist wirklich ein Implementierungsdetail. Vor langer Zeit dachte ich, dass es null oder tausend Bytes sein könnte, dass es keinen Einfluss auf die Sprachspezifikation hat. Nach einem Blick auf den Standard (Abschnitt 5.3.3) ist sizeof definiert, dass immer einer oder eine größere Zahl zurückgegeben wird, egal was passiert.

Die Größe einer am meisten abgeleiteten Klasse muss größer als Null sein.

Dies ist ua erforderlich, um Arrays von Objekten und Zeigern darauf zu behandeln. Wenn Ihre Elemente eine Größe von Null haben dürfen, wäre &(array[0]) identisch mit &(array[42]), wodurch alle möglichen Verwerfungen Ihrer Verarbeitungsschleifen verursacht werden.

Der Grund dafür, dass es sich nicht um ein Maschinen-Word handelt, besteht darin, dass es keine Elemente in ihm gibt, die es tatsächlich erfordern, dass es an einer Word-Grenze (z. B. einer Ganzzahl) ausgerichtet wird. Wenn Sie beispielsweise char x; int y; innerhalb der Klasse platzieren, taktet mein GCC dies auf acht Bytes (da das zweite int in dieser Implementierung ausgerichtet sein muss).

12
paxdiablo

Es gibt eine Ausnahme: Arrays der Länge 0

#include <iostream>

class CompletlyEmpty {
  char NO_DATA[0];
};

int main(int argc, const char** argv) {
  std::cout << sizeof(CompletlyEmpty) << '\n';
}
6

Obwohl es nicht erforderlich ist, Speicher für eine leere Klasse zuzuweisen, aber um Objekte aus leeren Klassen zu erstellen, weist der Compiler den minimal zuordenbaren Speicher zu, der 1 Byte beträgt. Auf diese Weise kann der Compiler zwei Objekte derselben leeren Klasse eindeutig unterscheiden und kann die Adresse des Objekts einem Zeiger des leeren Klassentyps zuweisen.

5
lalatendu

Ich denke, dass es hilfreich sein könnte, auf eine Antwort zu verweisen, die auch dieses Gute erklärt. Es ist über boost::compressed_pair von Logan Capaldo

Dies kann u helfen: -) http://bytes.com/topic/c/insights/660463-sizeof-empty-class-structure-1-a

Die Größe einer leeren Klasse oder Struktur ist 1

Der Grund dafür liegt in der korrekten Implementierung von Standardmäßig heißt es im C++ - Standard, dass "kein Objekt die gleiche Adresse im Speicher haben muss wie jede andere Variable" .... Was ist dies der einfachste Weg, um dies sicherzustellen? Stellen Sie sicher, dass alle Typen eine .__ haben. Größe ungleich Null. Um dies zu erreichen, fügt der Compiler ein Dummy-Byte .__ hinzu. in Strukturen und Klassen, die keine Datenelemente und keine virtuellen .__ haben. Funktionen, so dass sie eine Größe von 1 haben und nicht die Größe von 0 und dann haben sie garantiert eine eindeutige Speicheradresse.

3
Arsalan Mehmood

der Grund für eine Klasse ohne Datenelemente, jedoch mit der Größe 1 Byte, ist, dass dieser * strong text * im Speicher gespeichert werden muss, damit eine Referenz oder ein Zeiger auf das Objekt dieser Klasse zeigen kann

2
Ramiz

Die Zuteilung von 1 Byte für eine leere Klasse hängt vom Compiler ab. Compiler müssen sicherstellen, dass sich Objekte an verschiedenen Speicherorten befinden und dass sie einem Objekt eine andere Speichergröße als Null zuweisen. Hören Sie sich Hinweise zu diesem Thema hier an: http://listenvoice.com/listenVoiceNote.aspx?id=27

Obwohl Compiler einer leeren Klasse eine andere Größe als Null zuweisen, führen sie auch Optimierungen durch, wenn neue Klassen von leeren Klassen abgeleitet werden. Hören Sie in den Fragen der C++ - Programmierung von ListenVoice, die Fragen zur leeren Basis-Optimierung enthält.

2
user332764

leere Klasse - diese Klasse enthält keinen Inhalt.

jede Klasse, die nicht leer ist, wird durch ihren Inhalt im Speicher dargestellt.

wie wird nun eine leere Klasse im Speicher dargestellt? Da es keinen Inhalt gibt, der die Anwesenheit im Speicher nicht anzeigt, die Klasse jedoch vorhanden ist, ist es zwingend erforderlich, ihre Anwesenheit im Speicher anzuzeigen im Speicher ist 1 Byte erforderlich.

0
Ganesh
#include<iostream>
using namespace std;


    class Empty { };
    int main()
    {
        Empty* e1 = new Empty;
        Empty* e2 = new Empty;

        if (e1 == e2)
            cout << "Alas same address of two objects" << endl;
        else
            cout << "Okay it's Fine to have different addresses" << endl;

        return 0;
    }

Ausgabe: Okay, es ist gut, verschiedene Adressen zu haben

Durch die Rückgabe von Größe 1 wird sichergestellt, dass die beiden Objekte nicht dieselbe Adresse haben. 

0
Sandeep_black

Es ist nicht Null, um sicherzustellen, dass die zwei verschiedenen Objekte unterschiedliche Adressen haben. Verschiedene Objekte sollten unterschiedliche Adressen haben, sodass die Größe einer leeren Klasse immer 1 Byte beträgt.

0
Yadvendra Yadav

Ich denke, diese Frage ist nur von theoretischem Interesse, spielt aber in der Praxis keine Rolle.

Wie bereits erwähnt, schadet das Ableiten aus einer leeren Klasse keinen Schaden, da dadurch kein zusätzlicher Speicherplatz für den Basisklassenteil benötigt wird.

Wenn eine Klasse leer ist (was bedeutet, dass sie theoretisch keinen Instanzspeicher benötigt, dh keine nicht statischen Datenelemente oder virtuellen Elementfunktionen hat), können auch alle ihre Elementfunktionen funktionieren (und sollte) als statisch definiert werden. Es ist also nicht nötig, eine Instanz dieser Klasse zu erstellen.

Fazit: Wenn Sie eine leere Klasse X schreiben, machen Sie einfach alle Member-Funktionen statisch. Sie brauchen dann keine X-Objekte zu erstellen, und abgeleitete Klassen werden in keiner Weise beeinflusst.

0
kidfisto

Ich denke es ist so, weil 1 Byte die kleinste Speichereinheit ist, die als Platzhalter verwendet werden kann, und es kann keine Nullgröße angeben, da es nicht möglich ist, ein Array von Objekten zu erstellen.

und das, was Sie gesagt haben "Dies war ein wenig überraschend für mich, da ich erwartet hatte, dass es die Größe des Maschinenworts (32 Bits oder 4 Bytes) hat." ist wahr für Referenzvariable (Macine-Wörter) vom Typ empty (), nicht für die Klasse selbst (was ein abstrakter Datentyp ist),

0
lazarus