Memory alignment is important for the CPU to be able to read data. But it’s not always critical that the alignment is optimal.
A struct like the one below is aligned but comes with a size cost because the size of an int is larger than the size of a short and some padding is added.
struct Model { int a; short b; int c; char d; }
Probably in critical real-time software I would need to better align it by moving the second int above the first short value. And I will get a smaller size of the struct because the padding is not needed.
struct Model { int a; int c; short b; char d; }
I see a size of 16 bytes for the first version and 12 bytes for the second.
Another special case is serialization. When I want to transport data of a struct through a buffer, alignment is important because different compilers can handle padding in different ways. If I have a short (2 bytes) and an int (4 bytes), padding of 2 bytes will be added. But padding varies among compilers, so I should set the alignment of a struct to 1 byte, and thus memory is contiguous, with no padding. Therefore the compiler knows to read 2 bytes for the short and the following 4 bytes for the int.
#pragma pack(push, 1) struct Model { short exists; int items[2]; } model; #pragma pack(pop)
Continue reading Explaining memory alignment and undefined behavior to myself