2008-09-27 12 views

Antwort

0

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.

0

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.

+1

Ausrichtung * könnte * ins Spiel kommen. – jop

1

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.

2

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.

+0

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

9

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.

+0

Und auf den alten 68k macs, crash! –

+0

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. –

32

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!

+3

Um sicher zu sein, dass es funktioniert: printf ("sizeof (a) ==% d", (int) sizeof (a)); ' –

+1

@ ThomasPadron-McCarthy Eher 'printf ("% zu ", sizeof (a)) '... –

+0

@ H2CO3: Ja, das klappt auch, in einem modern genug C. –

0

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.

+0

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. –

4

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.

Verwandte Themen