je vais utiliser ce code, par exemple:C et de l'alignement de mémoire pour un protocole binaire
typedef struct __attribute__((aligned(XXX),packed))
{
uint16_t type;
uint32_t id_index;
} a_msg;
void write_func(){
a_mesg mymsg
mymsg.type = htons(1);
mymsg.id_index = htonl(5);
write(sock_fd, &mymsg, sizeof(a_mesg));
}
void read_func(){
a_mesg mymsg
read(sock_fd, &mymsg, sizeof(a_mesg));
mymsg.type = ntohs(mymsg.type);
mymsg.id_index = ntohl(mymsg.id_index);
}
Note: sock_fd
est un socket TCP. Ceci est un exemple un peu compressé et ne fonctionnerait peut-être pas mais je pense que vous voyez ce que j'essaye d'illustrer (un programme qui communique sur un protocole binaire).
Si l'application s'exécutait uniquement sur deux machines 32 bits communiquant entre elles via l'application, l'alignement (aligné (XXX)) serait naturellement défini sur 4. Si nous communiquons entre une machine 32 bits et une machine 64 bits, quel serait l'alignement?
- XXX devrait être 4 sur 32 et machines 64 bits?
- Est-ce que XXX doit être 8 sur les machines 32 et 64 bits?
- Est-ce que XXX devrait être 8 sur 64 machines et 4 sur 32 bits?
- XXX a une autre valeur.
Mon pari est sur autre 2.
Si vous utilisez gcc, à chaque membre de struct vous pouvez ajouter '__attribute __ ((emballé))'. – detly
Oh, attends, ils le font déjà. Alors pourquoi le 'pragma'? – detly
Serait-ce la même chose que de faire __attribute __ ((aligned (1), packed)) – Codeape