Jeder C-Compiler bietet die Möglichkeit, C-Strukturen (z . B. __attribute__ ((__packed__))
oder #pragma pack()
) zu "packen" . Jetzt wissen wir alle, dass Verpackung erforderlich ist, wenn wir Daten zuverlässig senden oder speichern möchten. Dies muss auch seit den ersten Tagen der C-Sprache erforderlich gewesen sein.
Ich frage mich also, warum gepackte Strukturen nicht Teil der C-Sprachspezifikation sind. Sie sind nicht einmal in C99 oder C11, obwohl die Notwendigkeit, sie zu haben, seit Jahrzehnten bekannt ist? Was fehlt mir? Warum ist es compilerspezifisch?
Antworten:
Ich denke, das liegt daran, dass es von der Kombination der verwendeten Ziel-CPU / des verwendeten Compilers abhängt. Dies bedeutet, dass es besser ist, eine Compiler-Direktive zu sein (da sie damit zusammenhängt) als ein Sprachaspekt, denn wie kann man das spezifizieren? Der einzige Weg, wie sie es schaffen könnten, ist die Vereinigung.
Der Artikel von Raymond gibt einen Einblick, warum dies so ist: http://www.catb.org/esr/structure-packing/
quelle
Es gibt drei Hauptfaktoren.
Unter Berücksichtigung dieser Faktoren füllen sowohl der Standard- als auch alle C / C ++ - Compiler routinemäßig Strukturen auf, um eine optimale Ausrichtung für den Prozessor sicherzustellen, bieten jedoch auch Mechanismen, um diese bei Bedarf für Interop-Zwecke zu überschreiben.
Dies wurde keineswegs übersehen. Es ist sehr gut verstanden und die aktuelle Situation ist beabsichtigt. Die neuesten Versionen des C ++ - Standards bieten umfassende Unterstützung für die Behandlung von Ausrichtungsproblemen, mit denen Sie möglicherweise nicht vertraut sind.
quelle
Es ist compilerspezifisch, da es nicht im Standard enthalten ist. Und es ist nicht im Standard enthalten, da es schwierig wäre, auf eine Weise zu spezifizieren, die für Compiler obskurer Plattformen mit erzwungenen Ausrichtungsbeschränkungen keinen großen Implementierungsaufwand erfordert.
Und keine dieser Bemühungen hat viel Rechtfertigung, da jeder Compiler / jede Plattform, um die sich jeder kümmert, der einen C89- oder späteren Compiler verwendet, bereits implementiert hat.
quelle
&
/|
Operationen ausgeführt werden, um die Werte jedes Felds zu lesen / schreiben.