Прочитал ответ на этот вопрос, где говорилось о выравнивании полей структуры и загорелся идеей пересчитать размер такой структуры:
struct Worker
{
char name[10];
char position[10];
float salary;
unsigned short missedDays : 5;
unsigned short mDaysWithoutReas : 5;
}
Итак, я представил память в виде массива и начал подсчеты.
1. Строка name. Она состоит из 10 байтов, но выравнивание добавляет еще 2.
[ 0 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ ] [ ]
[ word 0 ] [ word 1 ] [ word 2 ]
Итого получается 12 байтов.
Аналогично подсчитывается следующая строка.
И теперь мы получили размер двух строк, равный 12 байтов * 2 строки = 24 байтов.
2. float salary. Тип float занимает 4 байта, а значит одно машинное слово:
[ 0 ] [ 1 ] [ 2 ] [ 3 ]
[ word 0 ]
соответственно, мы уже получили размер 24 байтов + float = 28 байтов.
3. Битовые поля. Т.к. в сумме они дают 10 битов, то будет зарезервировано под них 2 байта (16 бит).
В итоге у нас получилась сумма 28 байтов + 2 байта = 30 байтов.
Но, найденный мною размер не соответствует тому, что возвращает функция sizeof() для типа Worker. А именно на выходе я получаю не 30 байтов, а 28 байтов!
Почему так получается?
Продвижение своими сайтами как стратегия роста и независимости