This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

How to pack structs?

I'm using the Keil uVision3. How do I pack structs?

Do I use __packed or is there a pragma?

is this correct? it doesn't compile...

typedef struct
{ UINT8 key_diff; UINT8 key_state;
} __packed SCmd_KeyPress;

Parents
  • The most common - and probably the only valid reason - for packing structures is to save space when doing embedded work. It is a trade-off between data size and code size, and often also a trade-off in speed.

    If you need to work with hardware, or write data to a file or build packets for transfer over a network, you should instead byte-pack your data yourself, similar to:

    pos = packet.data;
    pos = insert_u8(pos,my_8bit_value);
    pos = insert_u16(pos,my_16bit_value);
    ...
    assert(pos - packet.data == expected_packet_size);
    

    The reason for this is that when permanently storing information, or accessing hardware or communicating, you have more things to take into account. A packed structure will just save you the extra space between individual members, but may still have the incorrect byte order.

Reply
  • The most common - and probably the only valid reason - for packing structures is to save space when doing embedded work. It is a trade-off between data size and code size, and often also a trade-off in speed.

    If you need to work with hardware, or write data to a file or build packets for transfer over a network, you should instead byte-pack your data yourself, similar to:

    pos = packet.data;
    pos = insert_u8(pos,my_8bit_value);
    pos = insert_u16(pos,my_16bit_value);
    ...
    assert(pos - packet.data == expected_packet_size);
    

    The reason for this is that when permanently storing information, or accessing hardware or communicating, you have more things to take into account. A packed structure will just save you the extra space between individual members, but may still have the incorrect byte order.

Children
No data