Antwort
Ich nehme an, Sie bedeuten Struktur und nicht streng, aber auf einem 32-Bit-System wird es entweder 5 oder 8 Bytes sein, je nachdem, ob der Compiler die Struktur ist Klotzen.
Ich vermute, du meinst 'struct', nicht 'streng' und 'char' anstelle von 'Char'.
Die Größe wird die Implementierung abhängig sein. Bei den meisten 32-Bit-Systemen wird es wahrscheinlich 5 - 4 Bytes für den Zeiger, einen für das Zeichen geben. Ich glaube nicht, dass die Ausrichtung hier ins Spiel kommt. Wenn Sie jedoch 'c' und 'b' vertauscht haben, kann die Größe auf 8 Bytes anwachsen.
Ok, ich versuchte es aus (g ++ 4.2.3, mit Option -g) und ich bekomme 8.
Ausrichtung * könnte * ins Spiel kommen. – jop
Dies wird abhängig von Ihrer Architektur variieren und wie es grundlegende Datentypen behandelt. Es hängt auch davon ab, ob das System eine natürliche Ausrichtung erfordert.
Der genaue Wert ist sizeof (a).
Sie können auch ein Risiko eingehen und davon ausgehen, dass es in diesem Fall nicht weniger als 2 und nicht größer als 16 ist.
Obwohl es theoretisch keine Obergrenze gibt, da die Implementierung und die Größe von Zeigern compilerspezifisch ist, vorausgesetzt, sie verhalten sich entsprechend dem Standard. – Skizz
Im Gegensatz zu dem, was einige der anderen Antworten gesagt haben, auf den meisten Systemen, in Abwesenheit von a Pragma oder Compiler-Option, die Größe der Struktur wird mindestens 6 Bytes und auf den meisten 32-Bit-Systemen, 8 Bytes. Bei 64-Bit-Systemen könnte die Größe leicht 16 Byte betragen. Ausrichtung kommt ins Spiel; immer. Die sizeof eine einzige struct muss so sein, dass eine Reihe von den genannten Größen und die einzelnen Mitglieder des Arrays zugeordnet werden kann, sind für den Prozessor in Frage ausreichend ausgerichtet ist. wenn die Größe der struct Folglich wurde 5 als andere haben die Hypothese aufgestellt, dann wird eine Anordnung von zwei solcher Strukturen 10 Bytes lang sein würde, und der char Zeiger in dem zweiten Anordnungs-Elemente würde an einem ungerades Byte ausgerichtet werden, was würde (bei den meisten Prozessoren) verursachen einen großen Engpass in der Leistung.
Und auf den alten 68k macs, crash! –
Der Grund, warum ich die Hypothese aufgestellt habe, dass die Ausrichtung hier keine Auswirkung hat, ist, dass beide Elemente richtig ausgerichtet sind, ohne zwischen ihnen zu puffern. Ich habe nicht erwartet, dass sizeof am Ende auffüllen würde. Meine Hypothese wurde experimentell widerlegt, wie ich in einem Kommentar zu meiner Antwort bemerkte. –
Ich bekomme "sizeof (a) == 8", auf einer 32-Bit-Maschine. Die Gesamtgröße der Struktur auf der Verpackung abhängen: In meinem Fall ist die Standard-Verpackung 4, so ‚c‘ nimmt 4 Bytes, ‚b‘ nimmt ein Byte, so dass 3 Paddingbytes es zum nächsten Vielfachen von 4 zu bringen : 8. Wenn Sie diese Verpackung verändern wollen, haben die meisten Compiler einen Weg, es zum Beispiel auf MSVC zu verändern, zu:
#pragma pack(1)
typedef struct { char* c; char b; } a;
gibt sizeof (a) == 5. Wenn Sie das tun, seien Sie vorsichtig, Setzen Sie die Verpackung vor den Kopfzeilen der Bibliothek zurück!
Um sicher zu sein, dass es funktioniert: printf ("sizeof (a) ==% d", (int) sizeof (a)); ' –
@ ThomasPadron-McCarthy Eher 'printf ("% zu ", sizeof (a)) '... –
@ H2CO3: Ja, das klappt auch, in einem modern genug C. –
Die Größe der Struktur sollte bei einem 32-Bit-System 8 Byte betragen, so dass die Größe der Struktur ein Vielfaches von 2 wird. Dadurch werden einzelne Strukturen an den richtigen Bytegrenzen verfügbar, wenn ein Array von Strukturen deklariert wird. Dies wird durch Auffüllen der Struktur mit 3 Bytes am Ende erreicht. Wenn die Struktur den Zeiger nach dem Zeichen deklariert hätte, wäre es immer noch 8 Bytes in der Größe , aber die 3-Byte-Auffüllung wäre hinzugefügt worden, um den Zeiger (der ein 4-Byte-Element ist) auf 4 Byte ausgerichtet zu halten Adressgrenze.
Als Faustregel ist, dass Elemente an einer versetzten werden sollten, die das Vielfache ihres Bytegröße ist und die Struktur selbst sollte von einer Größe sein, die ein Vielfaches von 2 ist.
Es ist relativ ungewöhnlich, aber eine Struktur, die nur char-Arrays enthält, könnte eine ungerade Größe haben: 'struct unusual {char a [3]; Zeichen b [4]; }; 'könnte eine Größe von 7 haben, ohne irgendwelche negativen Effekte zu verursachen. Ein Compiler könnte es immer noch auf 8 Bytes auffüllen, aber es gibt keine offensichtliche Notwendigkeit, dies zu tun. –
Wenn Sie es manuell zählen möchten, ist die Größe einer Struktur nur die Größe jedes seiner Datenelemente nach Berücksichtigung der Ausrichtung. Es gibt keine magischen Overhead-Bytes für eine Struktur.
- 1. Wie finde ich die natürliche Größe/Größe einer Flash SWF-Datei?
- 2. Wie erhält man die Größe einer benutzerdefinierten Struktur? (Sizeof)
- 3. Wie finde ich die Größe der Pooling-Layer in Caffe?
- 4. Wie finde ich die Größe der statischen Zuordnungen von binären?
- 5. Wie finde ich die Größe der Tabelle in SQL?
- 6. Wie finde ich die Größe eines std :: bitset zur Kompilierzeit
- 7. C# Wie finde ich die Größe eines Referenztyps?
- 8. Wie finde ich die Größe eines Arrays in postgresql
- 9. Wie finde ich die Erweiterung einer Datei?
- 10. Wie finde ich die Koordinaten einer Adresse?
- 11. C# Wie kann ich ein Dictionary innerhalb einer Struktur deklarieren, die gemarshallt wird, um die Größe der Struktur zu erhalten?
- 12. Größe einer Struktur structs enthält bitfields
- 13. Wo finde ich Informationen zur Struktur des Delphi VMT?
- 14. Wie kann ich die Lebensdauer einer Struktur auf die einer übergeordneten Struktur beschränken?
- 15. Swift berechnet die falsche Größe der Struktur
- 16. Wo finde ich die Größe der SQL Server-Datentypen
- 17. Wie finde ich die Länge (oder Dimensionen, Größe) einer numpy Matrix in Python?
- 18. Wie finde ich die Größe der in einer HTML5 WebSQL Datenbank gespeicherten Daten?
- 19. Wie finde ich die Länge einer Linkedlist in einer Linkedlist?
- 20. Wie finde ich die Route, die mit einer URL übereinstimmt?
- 21. Wie finde ich die Schriftbreite?
- 22. Wie finde ich die optimale Verarbeitungsreihenfolge?
- 23. Wie kann ich eine Struktur innerhalb einer Struktur verschachtelt zugreifen
- 24. Wie finde ich die Größe der L1 Cache-Zeilen innerhalb eines Java-Prozesses?
- 25. Wie ignoriere ich eine Feldgröße in einer Struktur mit Marshal.SizeOf?
- 26. In SQL Wie kann ich die Struktur einer Ergebnismenge beschreiben?
- 27. In Go, wie bekomme ich die String-Repräsentation einer Struktur?
- 28. Wie kann ich die Struktur einer Mongo-Datenbank erkennen?
- 29. Wie kann ich die Deklaration einer Struktur in C verstecken?
- 30. Wie erkenne ich die Struktur einer PostgreSQL-Datenbank?
'sizeof (a)' ist ungültig C. Trotzdem wäre es in C++ gültig. – alk