Как только вы обнаружили проблемы с выравниванием в первый раз, я не уверен, какой метод является лучшим/безопасным способом борьбы с ними. У меня есть запись, которую я собираю для передачи по потоку и наоборот, поэтому он должен соответствовать спецификации интерфейса и не содержать отступов.Ada pragma Атрибут Pack или Alignment для записей?
Учитывая пример записи:
type MyRecord is record
a : Unsigned_8;
b : Unsigned_32;
end record;
Это по умолчанию потребует 8 байт, но я могу удалить упаковку, используя 2 метода:
for MyRecord'Alignment use 1;
или
pragma Pack (MyRecord);
I нашли несколько вопросов, относящихся к примерам C, но не смогли найти четкого ответа на этот метод. наиболее подходящим, как определить, какой метод использовать или если они эквивалентны?
UPDATE
Когда я попытался как на мою «реальную» коду, а не простой примере я обнаружил, что атрибут выравнивания достигается то, что я искал. pragma Pack значительно уменьшил размер, но не подтвердил, но я предполагаю, что он упаковал многие перечисленные типы, которые я использую, переопределяя атрибут «Использовать размер 8» для каждого типа.
+1. Упаковка должна использоваться для управления представлением в памяти, а не представлением потока. Если вам нужен конкретный формат «на проводе» (потому что другой конец ожидает такой формат), вы можете перегрузить стандартные процедуры для создания этого формата, независимо от упаковки в памяти. –
Когда я делаю это, он отправляет по одному полю на пакет, а не всю сериализованную запись на пакет? – MattP
См. Обновленный ответ. –