Расположение битовых полей в структуре
Учитывая, что есть некоторые несвязанные флаги (sta_scan
, search
), которые определены как битовые поля в структуре, как показано ниже. Имеет ли значение место, где эти флаги объявлены (с точки зрения экономии памяти)?
struct sta_all {
char name[16];
unsigned int sta_scan:1;
...
int interval;
unsigned int search:1;
}
2 ответа
Да, но не всегда.
Проверьте этот пример:
#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
Это происходит из-за заполнения на моей платформе.
Кстати, если вы действительно отчаянно нуждаетесь в эффективности памяти и можете принять потерю в скорости доступа, тогда вы можете использовать упаковку, как объясняется по ссылке выше.
Примечание: приведенный выше пример подтверждает то, что Jonathan Leffler упомянул в этом комментарии:
Каждому из этих битовых полей, вероятно, будет выделено столько же места, сколько и базовому типу (
unsigned int
) и будет использовать 1 из 32 (16, 64, …) битов в этом блоке памяти. Если вы решите использовать битовые поля, вы должны убедиться, что все битовые поля сгруппированы вместе; это сведет к минимуму пространство впустую. [...]. В контексте структуры компилятор не может свободно перемещать битовые поля.
.. который идеально гармонирует со связанным ответом, так как компилятору придется добавлять меньше char gap_{i}[3];
, когда мы кластеризируем битовые поля, минимизируя таким образом размер структуры!
Стоит ли оно того?
Не так уж много ИМХО...:)
В общем да. Элементы структуры обычно будут каким-либо образом выровнены (обычно по размеру элемента, иногда что-то большее), и смешивание разных размеров может привести к значительному заполнению. Есть способы смягчить это. В общем, если вы сгруппируете все элементы одного размера вместе, они, вероятно, будут упакованы без каких-либо отступов. Можно использовать прагмы, чтобы заставить структуру быть упакованной без заполнения, но тогда это приведет к неэффективному доступу без согласования к элементам структуры.