Итак, я кодирую некоторые структуры пакетов (Ethernet, IP и т. Д.) И заметил, что за некоторыми из них следует атрибут ((упакованный)), который мешает компилятору gcc пытаться добавить к ним дополнение , Это имеет смысл, потому что эти структуры должны идти на провод.Согласование Datastructure
Но тогда, я насчитал слова:
struct ether_header
{
u_int8_t ether_dhost[ETH_ALEN]; /* destination eth addr */
u_int8_t ether_shost[ETH_ALEN]; /* source ether addr */
u_int16_t ether_type; /* packet type ID field */
} __attribute__ ((packed));
Это скопировано с сайта, но мой код также использует 2 uint8_t и 1 uint16_t. Это добавляет до двух слов (4 байта).
В зависимости от источника система предпочитает, чтобы структуры были выровнены по краям 4,8 или даже 16 бит. Итак, я не понимаю, почему нужен атрибут ((упакованный)), поскольку afaik не должен упаковываться.
Кроме того, почему двойные скобки ((упакованные)) почему бы не использовать одну пару?
Я забыл, что uint8_t были массивами; глупый, но хороший призыв к планированию перемен. – mamidon