Прочитал ответ на этот вопрос, где говорилось о выравнивании полей структуры и загорелся идеей пересчитать размер такой структуры:
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 байтов
!
Почему так получается?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Хотите улучшить этот вопрос? Обновите вопрос так, чтобы он вписывался в тематику Stack Overflow на русском
Можно ли каким либо способом программно заблокировать изменение уровня звука в системе?
Есть класс (который по сути своей структура и далее я буду называть его именно так):