Выравнивание полей структуры

126
19 ноября 2020, 11:50

Прочитал ответ на этот вопрос, где говорилось о выравнивании полей структуры и загорелся идеей пересчитать размер такой структуры:

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 байтов!
Почему так получается?

READ ALSO
Крашится приложение qt на другом ПК [закрыт]

Крашится приложение qt на другом ПК [закрыт]

Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском

119
Блокировка регуляторов звука

Блокировка регуляторов звука

Можно ли каким либо способом программно заблокировать изменение уровня звука в системе?

109
Qt5: Обращение к данным в QVector для записи данных

Qt5: Обращение к данным в QVector для записи данных

Есть класс (который по сути своей структура и далее я буду называть его именно так):

135
Как объявить функцию, если не объявлена

Как объявить функцию, если не объявлена

На ОС Linux есть функция getchar_unlocked()

141