Расположение битовых полей в структуре

Учитывая, что есть некоторые несвязанные флаги (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];, когда мы кластеризируем битовые поля, минимизируя таким образом размер структуры!


Стоит ли оно того?

Не так уж много ИМХО...:)

В общем да. Элементы структуры обычно будут каким-либо образом выровнены (обычно по размеру элемента, иногда что-то большее), и смешивание разных размеров может привести к значительному заполнению. Есть способы смягчить это. В общем, если вы сгруппируете все элементы одного размера вместе, они, вероятно, будут упакованы без каких-либо отступов. Можно использовать прагмы, чтобы заставить структуру быть упакованной без заполнения, но тогда это приведет к неэффективному доступу без согласования к элементам структуры.

Другие вопросы по тегам