Emballage par disposition
Dans le cas présent, vous êtes en sécurité. Votre structure input_event est déjà configurée et emballée.
struct timeval time; /* 8 bytes */
__u16 type; /* 2 bytes */
__u16 code; /* 2 bytes */
__s32 value; /* 4 bytes */
Cela signifie que les membres forment des blocs propres de 32 bits et qu'aucun remplissage n'est nécessaire. Ce site article explique comment la taille des membres d'une structure (en particulier les caractères) et leur disposition affectent le remplissage et donc la taille finale d'une structure.
Emballage par le préprocesseur
L'empaquetage des structs via le préprocesseur semble être une bonne solution à première vue. En y regardant de plus près, plusieurs inconvénients apparaissent et l'un d'eux vous frappe au point qui vous intéresse (voir aussi #pragma pack effect )
Performance
Le remplissage garantit que les membres de votre structure sont accessibles sans avoir à chercher dans les blocs de mémoire (blocs de 4 octets sur une machine 32 bits et blocs de 8 octets sur une machine 64 bits respectivement). En conséquence, l'empaquetage de telles structures conduit à ce que les membres s'étendent sur plusieurs blocs de mémoire et nécessitent donc que la machine les recherche.
Différentes plates-formes (Archs, compilateurs)
Les instructions du préprocesseur sont très spécifiques au fournisseur et à l'architecture. Ainsi, leur utilisation entraîne une portabilité moindre ou, dans le pire des cas, la non-portabilité de votre code.
Conclusion
En tant qu'auteur de ce article (déjà mentionné ci-dessus), même NTP lit directement les données du réseau dans les structures. Par conséquent, la solution la plus sûre et la plus portable est d'organiser soigneusement vos structures et de les remplir à la main.