Nachdem ich gerade Ausrichtungsprobleme zum ersten Mal entdeckt habe, bin ich mir nicht sicher, welche Methode der beste/sicherste Weg ist, mit ihnen umzugehen. Ich habe einen Datensatz, den ich serialisiere, um ihn über einen Stream zu senden, und umgekehrt, so dass er die Schnittstellenspezifikation erfüllen muss und kein Padding enthalten muss.Ada Pragma Pack oder Alignment-Attribut für Datensätze?
das Beispiel Datensatz Gegeben:
type MyRecord is record
a : Unsigned_8;
b : Unsigned_32;
end record;
Diese standardmäßig würde 8 Bytes erfordern, aber ich bin in der Lage zwei Methoden Verpackung zu entfernen, mit:
for MyRecord'Alignment use 1;
oder
pragma Pack (MyRecord);
I Ich habe ein paar Fragen zu C-Beispielen gefunden, konnte aber keine eindeutige Antwort darauf finden, welche Methode es ist die am besten geeignete, wie zu bestimmen, welche Methode zu verwenden oder ob sie gleichwertig sind?
UPDATE
Als ich versuchte, beide auf meinem ‚echten‘ Code eher als ein einfaches Beispiel, das ich, dass die Ausrichtung gefunden Attribut erreicht, was ich suchte. pragma Pack hat die Größe erheblich reduziert, nicht bestätigt, aber ich nehme an, dass es die vielen aufgezählten Typen, die ich verwende, gepackt hat, wobei das Attribut 'Size use 8' für jeden Typ außer Kraft gesetzt wurde.
+1. Packen sollte verwendet werden, um die In-Memory-Repräsentation zu steuern, nicht die Stream-Repräsentation. Wenn Sie ein bestimmtes Format "on the wire" benötigen (weil das andere Ende dieses Format erwartet), können Sie die Standardprozeduren überladen, um dieses Format unabhängig von der Packung im Speicher zu erzeugen. –
Wenn ich dies tue, sendet es ein Feld pro Paket und nicht den gesamten serialisierten Datensatz pro Paket? – MattP
Siehe aktualisierte Antwort. –