Ich habe einen C # -Hintergrund. Ich bin ein Neuling in einer einfachen Sprache wie C.
In C # wird struct
der Speicher standardmäßig vom Compiler angelegt. Der Compiler kann Datenfelder neu anordnen oder zusätzliche Bits implizit zwischen Feldern auffüllen. Daher musste ich ein spezielles Attribut angeben, um dieses Verhalten für ein genaues Layout zu überschreiben.
AFAIK, C ordnet das Speicherlayout von a struct
standardmäßig nicht neu an oder richtet es nicht aus . Ich habe jedoch gehört, dass es eine kleine Ausnahme gibt, die sehr schwer zu finden ist.
Wie verhält sich C im Speicherlayout? Was sollte nachbestellt / ausgerichtet werden und nicht?
quelle
#pragma pack
jedoch mit einer genaueren Kontrolle über die Semantik._Alignas
.Es ist implementierungsspezifisch, aber in der Praxis
#pragma pack
lautet die Regel (in Abwesenheit oder dergleichen):sizeof(T)
Bytes.Also, gegeben die folgende Struktur:
ch1
ist bei Offset 0s
am Versatz 2ch2
ist bei Offset 4, unmittelbar nach sll
am Versatz 8i
ist bei Offset 16, direkt nach llSo
sizeof(ST)
ist 24.Sie kann durch Neuanordnen der Elemente auf 16 Byte reduziert werden, um ein Auffüllen zu vermeiden:
quelle
char
Ihrem Beispiel am besten ein letztes Mitglied hinzu.sizeof(T)
Bytes. Beispielsweisedouble
beträgt eine übliche 32-Bit-Architektur 8 Byte, erfordert jedoch häufig nur eine 4-Byte-Ausrichtung . Darüber hinaus füllt die Polsterung am Ende der Struktur nur die Ausrichtung des breitesten Strukturelements auf. Zum Beispiel könnte eine Struktur mit 3 Zeichenvariablen keine Auffüllung haben.Sie können beginnen, indem Sie den Wikipedia-Artikel zur Datenstrukturausrichtung lesen , um ein besseres Verständnis der Datenausrichtung zu erhalten.
Aus dem Wikipedia-Artikel :
Ab 6.54.8 Strukturverpackende Pragmas der GCC-Dokumentation:
quelle