Я нашел следующий пример:
#include <stdio.h>
// Space optimized representation of the date
struct date {
// d has value between 1 and 31, so 5 bits
// are sufficient
unsigned int d : 5;
// m has value between 1 and 12, so 4 bits
// are sufficient
unsigned int m : 4;
unsigned int y;
};
int main()
{
printf("Size of date is %lu bytes\n", sizeof(struct date));
struct date dt = { 31, 12, 2014 };
printf("Date is %d/%d/%d", dt.d, dt.m, dt.y);
return 0;
}
Результаты
Size of date is 8 bytes
Date is 31/12/2014
Я не могу понять первый результат. Почему 8 байт?
Мои мысли:
y
— 4 байта, d
— 5 бит и m
— 4 бита. Всего 4 байта и 9 бит. 1 байт - это 8 бит, тогда всего 41 бит.
Наименьшая единица - байты, поэтому 8 цифр -> 8 байтов
Компоновка и порядок битовых полей полностью определяются реализацией. Без указания вашей ОС и компилятора до точных версий ответ невозможен.
@Cheatah, хорошо, мы можем оптимизировать пространство, используя битовые поля. но как? почему он равен 8 байтам? как вычислили?
Очень хорошее объяснение здесь
C автоматически упаковывает вышеуказанные битовые поля настолько компактно, насколько это возможно, при условии, что максимальная длина поля меньше или равна целочисленной длине слова компьютера. Если это не так, то некоторые компиляторы могут допускать перекрытие памяти для полей, в то время как другие сохранят следующее поле в следующем слове (см. комментарии о переносимости битовых полей ниже).
Ответ — выравнивание. Из соображений эффективности компилятор выравнивает значения по эффективным границам. Это избавит процессор от необходимости выполнять всевозможные дополнительные операции.