Etwas über eine komplett leere Klasse

9
%Vor%

Seine Ausgabe ist:

  

0 0 0

     

0xbff36ad0 0xbff36ac8

     

Anzahl der Elemente ist: 4

Die Ergebnisse sind so überraschend.

Wie oben gezeigt, ist Empty eine Klasse, deren Größe und ihre Objekte alle 0 sind, warum?

Vielleicht denke ich, weil die Größe einer leeren Klasse 1 ist, und wenn die Klasse nicht leer ist, wird ihre Größe durch Mitglieder bestimmt, aber hier ist ihr Mitglied speziell, es ist ein Array der Länge Null und die Größe dieses Arrays ist 0, also die Größe der Klasse und der Objekte sind alle 0.

Es ist nur meine Vermutung. Während das Programm ausgeführt wird, können wir sehen, dass zwei Objekte beide eine Adresse haben und die Adresse anders ist.

Hier ist meine Frage: wenn Objekt der Größe 0 implementiert werden kann, warum der C ++ - Standard besagt, dass leere Objekte sizeof () = 1 haben, ist es für "sicherzustellen, dass die Adressen von zwei verschiedenen Objekten unterschiedlich sind" < a href="http://www.stroustrup.com/bs_faq2.html#sizeof-empty"> Warum ist die Größe einer leeren Klasse nicht null? , aber jetzt haben wir eine andere Adresse als Ausgabe Wie passiert das?

Außerdem ist die letzte Zeilenausgabe unabhängig von der Größe des Array-Sets immer 4, warum?

Danke:)

PS: Ich starte dieses Programm auf MacOS und der Compiler ist Apple LLVM Version 5.1 (clang-503.0.40) (basierend auf LLVM 3.4svn)

    
simon_xia 12.09.2014, 08:48
quelle

1 Antwort

1

Ich werde einen Stich machen, da niemand mehr erfahren hat:

  

Wie oben gezeigt, ist Empty eine Klasse, deren Größe und ihre Objekte alle 0 sind, warum?

Zero-size-Arrays sind vom Standard nicht erlaubt, daher ist sizeof(Empty) , was den Standard betrifft, ein bedeutungsloser Ausdruck, Sie befinden sich bereits im Bereich des undefinierten Verhaltens.

  

Hier ist meine Frage: Wenn Objekt der Größe 0 implementiert werden kann, [...] Warum ist die Größe einer leeren Klasse nicht Null? , aber jetzt haben wir eine andere Adresse als die Ausgabe, wie passiert das?

Wie oben kann ein Objekt der Größe 0 in einem gültigen Standard-C ++ - Programm (mit Ausnahme von Basisklassen -Unterobjekten ) nicht existieren.

Ihr Compiler erlaubt dies als eine Erweiterung des Standards, und solange Sie diese Erweiterung in dem Bereich verwenden, für den sie vorgesehen war (dh als ein vorflexibler Array Member Hack), sollten Sie keine Probleme haben, obwohl Ihr Der Code ist nicht übertragbar. Ihr Beispiel oben ist jedoch nicht, wie zero-sized Arrays verwendet werden sollen (nicht zu erwähnen, es gibt bessere Konstrukte in C ++ für die Behandlung dieser Situationen sowieso).

Ihr Compiler ist intelligent genug, um separate Adressen für em1 und em2 bereitzustellen, aber Sie sollten feststellen, dass alle Elemente von set tatsächlich dieselbe Adresse haben.

  

Außerdem ist die letzte Zeilenausgabe unabhängig von der Größe des Array-Sets immer 4, warum?

Da Ihr Compiler sizeof(Empty) und Arrays von Empty als null betrachtet, teilen Sie durch Null, was ein undefiniertes Verhalten ist. Sie könnten feststellen, dass Ihr Programm abstürzt, wenn Sie Optimierungen deaktivieren, bei GCC zum Beispiel stürzt Ihr Programm mit -O0 ab, aber nicht mit -O1 .

    
user657267 16.09.2014, 12:48
quelle

Tags und Links