Compiler polst Strukturen auf Bytes, die Vielfache von 2 oder 4 sind, um den Zugriff darauf in Maschinencode einfacher zu implementieren. Ich würde #pragma pack nur verwenden, wenn es wirklich notwendig wäre, und das gilt normalerweise nur, wenn Sie auf wirklich niedriger Ebene arbeiten (wie auf Firmware-Ebene). Wikipedia-Artikel dazu.
Das passiert, weil Mikroprozessoren spezifische Operationen haben, um auf Speicher an Adressen zuzugreifen, die Vielfache von vier oder zwei sind, und das macht den Quellcode einfacher zu erstellen, er verwendet Speicher effizienter und manchmal ist der Code ein wenig schneller. Es gibt Möglichkeiten, dieses Verhalten zu stoppen, natürlich wie die #pragma pack Direktive, aber sie sind kompilerabhängig. Aber die Standardwerte des Kompilers zu überschreiben ist normalerweise eine schlechte Idee, die Kompiler-Experten hatten einen sehr guten Grund, es so zu machen.
Eine bessere Lösung wäre für mich, das mit reinem C zu lösen, was sehr, sehr einfach ist, und würde einer guten Programmierpraxis folgen, nämlich: sich niemals auf das zu verlassen, was der Compiler mit Ihren Daten auf niedriger Ebene tut.
Ich weiß, dass es einfach ist, einfach #pragma pack(1) zu schreiben, und uns allen das Gefühl gibt, dass wir direkt verstehen, was im Inneren des Computers passiert, und das begeistert jeden echten Programmierer, aber die beste Lösung ist immer die, die mit der Sprache implementiert wird, die Sie verwenden. Es ist einfacher zu verstehen und daher einfacher zu warten; es ist Standardverhalten, also sollte es überall funktionieren, und in diesem speziellen Fall ist die C-Lösung wirklich einfach und geradlinig: lesen Sie Ihre Strukturattribut für Attribut, so:
void readStruct(header &h, std::ifstream file)
{
file.read((char*) &h.type, sizeof(char));
file.read((char *) &h.size, sizeof(short));
}
(das wird funktionieren, wenn Sie die Struktur global definieren, natürlich)
Noch besser wäre es, da Sie mit C++ arbeiten, eine Methodenfunktion zu definieren, die das Lesen für Sie durchführt, und später einfach myObject.readData(file)
aufrufen. Können Sie die Schönheit und die Einfachheit erkennen?
Einfacher zu lesen, zu warten, zu kompilieren, führt zu schnellerem und optimiertem Code, es ist Standard.
Normalerweise mag ich es nicht, mit #pragma-Direktiven zu spielen, es sei denn, ich bin mir ziemlich sicher, was ich tue. Die Auswirkungen können überraschend sein.