Да, но не всегда.
Проверьте этот пример:
#include <stdio.h>
#include <string.h>
struct {
char name[16];
unsigned int sta_scan:1;
int interval;
unsigned int search:1;
} sta_all;
int main( ) {
sta_all.interval = 4;
printf( "Sizeof(sta_all) : %zu\n", sizeof(sta_all) );
return 0;
}
Выход:
Sizeof(sta_all) : 28
а также:
#include <stdio.h>
#include <string.h>
struct {
char name[16];
unsigned int sta_scan:1;
unsigned int search:1;
int interval;
} sta_all;
int main( ) {
sta_all.interval = 4;
printf( "Sizeof(sta_all) : %zu\n", sizeof(sta_all) );
return 0;
}
Выход:
Sizeof(sta_all) : 24
Это происходит из-за padding, на моей платформе.
Кстати, если вы действительно отчаянно нуждаетесь в эффективности использования памяти и можете смириться с потерей скорости доступа, тогда вы можете использовать упаковку, как объясняется по ссылке выше.
Примечание. Приведенный выше пример подтверждает то, что Джонатан Леффлер упомянул в этом комментарий:
Каждому из этих битовых полей, вероятно, будет выделено столько же места, сколько базовому типу (unsigned int
), и будет использоваться 1 из 32 (16, 64, …) битов в этой единице хранения. Если вы решите использовать битовые поля, вы должны убедиться, что все битовые поля сгруппированы вместе; это сведет к минимуму потраченное впустую пространство. [...]. В контексте структуры компилятор не может свободно перемещать битовые поля.
.. что идеально гармонирует со связанным ответом, поскольку компилятору придется добавить меньше char gap_{i}[3];
, когда мы кластеризуем битовые поля, тем самым сводя к минимуму размер структуры!
Стоит ли оно того?
ИМХО не очень... :)
person
gsamaras
schedule
01.09.2016
unsigned int
), и будет использоваться 1 из 32 (16, 64, …) битов в этой единице хранения. Если вы решите использовать битовые поля, вы должны убедиться, что все битовые поля сгруппированы вместе; это сведет к минимуму потраченное впустую пространство. Вы должны подумать о том, будет лиbool
(из<stdbool.h>
или_Bool
) служить вашим целям также или лучше. Многие детали битовых полей определяются реализацией, но в контексте структуры у компилятора нет свободы перемещать битовые поля. - person Jonathan Leffler   schedule 01.09.2016