In _this particular case_, GCC would behave like this:
uint8_t a,b;
printf(%p,%p\n",&a,&b);
0x10000000,0x10000004
Because it's more efficient (faster) for it to fetch on a 4-byte boundary.
However, you can tell GCC that you care more about size than speed like this:
#pragma pack(1) // Set packing/alignment to 1 byte
uint8_t a,b;
#pragma pack() // Restore default packing
printf(%p,%p\n",&a,&b);
0x10000000,0x10000001
(All this is typed from memory, so.. No guarantees, but this is basically how it works)