Frage

Zum Beispiel, wenn ich eine lange Variable deklarieren, kann ich davon ausgehen, es wird immer auf einem „sizeof (long)“ Grenze ausgerichtet werden? Microsoft Visual C ++ Online-Hilfe sagt so, aber ist es das Standardverhalten?

einige weitere Informationen:

a. Es ist möglich, eine falsch ausgerichtete ganze Zahl (* bar) explizit zu erstellen:

  

char foo [5]

     

int * bar = (int *) (& foo [1]);

b. Offenbar #pragma pack () wirkt sich nur auf Strukturen, Klassen und Gewerkschaften.

c. MSVC Dokumentation besagt, dass POD-Typen auf ihre jeweiligen Größen ausgerichtet sind (aber es ist immer noch standardmäßig und ist es das Standardverhalten, ich weiß es nicht)

War es hilfreich?

Lösung

Wie andere erwähnt haben, ist dies nicht Teil des Standard und ist mit dem Compiler überlassen zu implementieren, wie es für den Prozessor in Frage richtig hält. Zum Beispiel VC leicht unterschiedliche Ausrichtungsanforderungen für einen ARM-Prozessor implementieren könnte, als es für x86-Prozessoren.

Microsoft VC implementiert, was im Grunde natürliche Ausrichtung bis zur Größe von der #pragma pack Richtlinie oder der / Zp-Befehlszeilenoption angegeben aufgerufen wird. Dies bedeutet, dass beispielsweise jedes POD-Typ mit einer Größe, die kleiner oder gleich 8 Byte wird auf der Grundlage ihrer Größe ausgerichtet werden. Alles, was größer wird auf einer 8-Byte-Grenze ausgerichtet werden.

Wenn es wichtig ist, dass Sie die Ausrichtung steuern für verschiedene Prozessoren und verschiedene Compiler, dann können Sie eine Packungsgröße von 1 und Pad Ihre Strukturen verwenden.

#pragma pack(push)
#pragma pack(1)    
struct Example
{
   short data1;     // offset 0
   short padding1;  // offset 2
   long data2;      // offset 4
};
#pragma pack(pop)

In diesem Code die padding1 Variable existiert nur, um sicherzustellen, dass Daten2 ist natürlich ausgerichtet.

Antwort a:

Ja, das kann leicht falsch ausgerichtete Daten verursachen. Auf einem x86-Prozessor, ist dies überhaupt schadet nicht wirklich viel. Auf anderen Prozessoren kann bei einem Crash oder eine sehr langsame Ausführung zur Folge hat, dies. Zum Beispiel würde der Alpha-Prozessor einen Prozessor Ausnahme auslösen, die durch das Betriebssystem aufgefangen werden würde. Das Betriebssystem würde dann die Anweisung überprüft und dann tut die Arbeit erforderlich, um die falsch ausgerichteten Daten zu verarbeiten. Dann die Ausführung fortgesetzt. Das __unaligned Schlüsselwort kann in VC verwendet wird, nicht ausgerichteten Zugriff für Nicht-x86-Programme (das heißt für CE) zu markieren.

Andere Tipps

In der Standardeinstellung, ja. Er kann jedoch über das pack () #pragma geändert werden.

Ich glaube nicht, dem C ++ Standard alle Anforderungen in dieser Hinsicht machen, und überlässt es die Umsetzung auf.

C und C ++ tun Mandat nicht jede Art von Ausrichtung. Aber natürliche Ausrichtung wird durch x86 stark bevorzugt und ist erforderlich von den meisten anderen CPU-Architekturen und Compiler tut im Allgemeinen alles in ihrer Macht CPUs glücklich zu halten. So in der Praxis werden Sie nicht ein Compiler generieren falsch ausgerichtete Daten sehen, wenn Sie wirklich arm ist es verdrehen.

Ja, werden alle Arten immer ausgerichtet auf mindestens ihre Ausrichtungsanforderungen.

Wie könnte es anders sein?

Beachten Sie aber, dass die sizeof () ein Typ ist nicht das gleiche wie es Ausrichtung ist.

Sie können den folgenden Makro verwenden, um die Ausrichtungsanforderungen eines Typs zu bestimmen:

#define ALIGNMENT_OF( t ) offsetof( struct { char x; t test; }, test )

Abhängig von dem Compiler, der Pragmas und der Optimierungsstufe. Mit modernen Compiler können Sie auch Zeit oder Raumoptimierung wählen, die auch die Ausrichtung der Typen ändern könnte.

Im Allgemeinen wird es sein, weil das Lesen / Schreiben, um es schneller ist, dass Art und Weise. Aber fast jeder Compiler hat einen Schalter diese auszuschalten. In gcc seine -malign - ???. Mit Aggregaten werden sie in der Regel ausgerichtet und so bemessen ist, basierend auf den Ausrichtungsanforderungen jedes Element innerhalb.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top