Heim  >  Artikel  >  Backend-Entwicklung  >  Wie wirkt sich die Datenausrichtung auf die Größe von C-Klassen aus?

Wie wirkt sich die Datenausrichtung auf die Größe von C-Klassen aus?

Susan Sarandon
Susan SarandonOriginal
2024-10-25 00:06:30828Durchsuche

How Does Data Alignment Affect the Size of C   Classes?

Die Bestimmung der Klassengröße in C verstehen

Die Bestimmung der Größe einer C-Klasse zur Kompilierungszeit erfordert ein Verständnis der Prinzipien der Datenausrichtung. Für jedes Mitglied innerhalb einer Klasse gelten Größen- und Ausrichtungsanforderungen.

Prozess zur Größen- und Ausrichtungsberechnung

Während der Kompilierung initialisiert der Compiler eine laufende Größe (S) auf Null und eine Ausrichtungsanforderung (A) auf eins (Byte). Für jedes Mitglied in der Klasse:

  1. Die Ausrichtungsanforderung (a) wird überprüft. Wenn S kein Vielfaches von a ist, wird S auf das nächste Vielfache angepasst. Dies bestimmt den Offset des Mitglieds.
  2. Das kleinste gemeinsame Vielfache (LCM) von A und a wird berechnet und A wird auf LCM aktualisiert.
  3. Leerzeichen für das Mitglied werden hinzugefügt bis S.

Nach der Verarbeitung aller Mitglieder wird die endgültige Größe der Klasse ermittelt. Es handelt sich um den Wert von S, der so angepasst wird, dass er ein Vielfaches der Ausrichtungsanforderung der gesamten Klasse (A) ist.

Ausrichtungsüberlegungen

  • Arrays: Größe ist die Anzahl der Elemente multipliziert mit der Elementgröße, und die Ausrichtungsanforderung ist die gleiche wie bei einem Element.
  • Strukturen: Größe und Ausrichtungsanforderungen werden rekursiv bestimmt.
  • Unions: Größe ist die Größe des größtes Mitglied, aufgerundet auf die LCM aller Ausrichtungen der Mitglieder.

Beispiel

Der bereitgestellte Code veranschaulicht diesen Prozess:

<code class="cpp">#include <xmmintrin.h>

class TestClass1 {
  __m128i vect;
}; // Size: 16 bytes

class TestClass2 {
  char buf[8];
  char buf2[8];
}; // Size: 16 bytes

class TestClass3 {
  char buf[8];
  __m128i vect;
  char buf2[8];
}; // Size: 48 bytes

class TestClass4 {
  char buf[8];
  char buf2[8];
  __m128i vect;
}; // Size: 32 bytes</code>

TestClass3 ist trotz der gleichen Mitglieder wie TestClass1 und TestClass2 aufgrund der Ausrichtungsanforderung von __m128i, die eine 16-Byte-Grenze erzwingt, größer (48 Bytes). TestClass4 hat mit einer anderen Reihenfolge der Datenelemente eine andere Ausrichtung und Größe (32 Bytes).

Das obige ist der detaillierte Inhalt vonWie wirkt sich die Datenausrichtung auf die Größe von C-Klassen aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn