構造体のアライメント

こんな構造体を作ってパケットを受信するときに困ったことが起きた。

struct rcv_format{

    uint16_t mtype;

    uint16_t mlen;

    uint16_t seq;

    uint8_t ipv;

    uint8_t subpre;

    unsigned char addr[16];

    float rtt;

    float jitter;

    float ploss;

    uint64_t date;

};

  指定したアドレスから指定の長さのアドレスをのぞいてみるデバッグ用の関数を用いてこの構造体を見てみると、なぜかfloat plossとuint64_t dateの間に無駄なパディングがあった。このため、uint64_t dateの部分を受け取り損ねていた。詳しいことはよく理解できていないが、パディングはある方が良いらしい。乱用は禁物とのこと。

 とはいえ今回はパディングがあっては困るので以下のようにするとパディングが消えた。

struct rcv_format{

    uint16_t mtype;

    uint16_t mlen;

    uint16_t seq;

    uint8_t ipv;

    uint8_t subpre;

    unsigned char addr[16];

    float rtt;

    float jitter;

    float ploss;

    uint64_t date;

}__attribute__((packed));