Q:

Размер структуры в зависимости от расположения полей

Добрый день, господа! 
Столкнулся с проблемой выравнивания данных в структуре. 
Итак, имеем 2 типа структур
typedef struct
{
    uint32_t FieldA;
    uint32_t FieldB;
    uint16_t FieldC;
    int8_t   FieldD;
} StructType1;

и
typedef struct
{
    uint32_t FieldA;
    uint16_t FieldC;
    uint32_t FieldB;
    int8_t   FieldD;
} StructType2;

Архитектура 32-битная, соответственно в памяти структуры выравниваются под 4 байта.  Однако при попытке узнать размер получаем разные результаты. 
a = (int)sizeof(StructType1);
b = (int)sizeof(StructType2);

a = 12
b = 16

Дело в конкретном компиляторе(IAR ARM), особенностях языка C или настройках оптимизации? 

A:

В этой структуре
typedef struct
{
    uint32_t FieldA;
    uint16_t FieldC;
    uint32_t FieldB;
    int8_t   FieldD;
}StructType2;

член данных FieldB должен быть выравнен на границу, кратную 32 битам, то есть 4 байтам.  Поэтому  после поля FieldC  следуют дополнительные 2 байта для выравнивания следующего за ним поля. 
Так как структура должна быть выравнена на границу 4 байтов, то в конец структуры добавляется еще 3 байта. 
Для этой структуры
typedef struct
{
    uint32_t FieldA;
    uint32_t FieldB;
    uint16_t FieldC;
    int8_t   FieldD;
}StructType1;

достаточно добавить в ее конец один байт, чтобы вся структура была выравнена на границу 4 байтов. 
Дело не в компиляторе, а в выравнивании структуры в соответствии с выравниванием границы для размещения ее члена данных с максимальным размером, который требует выравнивание. 
Имейте в виду, что существует так называемая арифметика указателей, результат которой должен указывать на следующий член массива.  Чтобы обеспечить, чтобы следующий член массива был выравнен соответствующим образом, структуры дополняются нужным количеством байтов.