Если вы можете выполнять смещенные обращения без штрафа и не возражаете против трюков, специфичных для компилятора или платформы, для управления заполнением, это может сработать. (Полагаю, вы согласны с этим, поскольку вы упомянули __attribute__((packed))
).
В этом случае самым хорошим подходом является написание упаковщиков значений для ваших необработанных типов данных и использование их вместо необработанного типа при объявлении вашей структуры в первую очередь. Помните, что упаковщик значений должен быть тривиальным / POD-подобным, чтобы это работало. Если у вас есть платформа POSIX, вы можете использовать ntohs/ntohl
для преобразования в порядковый номер, вероятно, она будет лучше оптимизирована, чем вы пишете сами.
Если неправильно выровненные обращения запрещены или медленны на вашей платформе, вам нужно вместо этого десериализовать. Поскольку у нас пока нет отражения, вы можете сделать это с теми же обертками значений (плюс заполнитель Ignore<N>
, пропускающий N байт для полей, которые вас не интересуют), и объявить их в кортеже вместо структуры - вы может перебрать членов в кортеже и сказать каждому десериализовать себя из сообщения.