LINUX.ORG.RU

История изменений

Исправление Moisha_Liberman, (текущая версия) :

Выровнять блок памяти, в который ты получаешь пакет так же как выравнивается структура. Либо руками начитывать отдельно каждое поле.

Для сетевых протоколов как правило предполагается что работа идёт со структурами с атрибутами __packed__ и aligned(x) до кучи. «х» в aligned это степень двойки.

Т.е., получим что-то типа такого:

typedef struct {
     unsigned short some_symbol;
     char symbol_one;
     int symbol_tho;
     char symbol_four;
}__attribute__((packed, aligned(1))) my_sample_struct_t;

Разницу между размерами структуры с атрибутами и без можно посмотреть sizeof(my_sample_struct_t);. Разница и будет объясняться тем, что структура упакована или нет и каково выравнивание между полями структуры.

По скорости так же возможны различия. Неупакованные структуры в случае их динамического выделения, выделяются как правило быстрее, т.к. нет жестких требований к размеру памяти (чтобы влезала вся структура со всеми данными и чтобы было место под заполнение между полями структуры в один блок). Неупакованные и невыровненные структуры в памяти могут располагаться как угодно. С прогалами между полями структуры или без. В общем, слегка быстрее с ними работать, но иногда проблематичнее в части протоколов.

Исправление Moisha_Liberman, :

Выровнять блок памяти, в который ты получаешь пакет так же как выравнивается структура. Либо руками начитывать отдельно каждое поле.

Для сетевых протоколов как правило предполагается что работа идёт со структурами с атрибутами __packed__ и aligned(x) до кучи. «х» в aligned это степень двойки.

Т.е., получим что-то типа такого:

typedef struct {
     unsigned short some_symbol;
     char symbol_one;
     int symbol_tho;
     char symbol_four;
}__attribute__((packed, aligned(1))) my_sample_struct_t;

Разницу между размерами структуры с атрибутами и без можно посмотреть sizeof(my_sample_struct_t);. Разница и будет объясняться тем, что структура упакована или нет и каково выравнивание между полями структуры.

По скорости так же возможны различия. Неупакованные структуры в случае из динамического выделения, выделяются как правило быстрее, т.к. нет требований к размеру памяти (чтобы влезала вся структура со всеми данными и чтобы было место под заполнение между полями структуры).

Исходная версия Moisha_Liberman, :

Вообще-то...

Выровнять блок памяти, в который ты получаешь пакет так же как выравнивается структура. Либо руками начитывать отдельно каждое поле.

Для сетевых протоколов как правило предполагается что работа идёт со структурами с атрибутами packed и aligned(x) до кучи. «х» в aligned это степень двойки.

Т.е., получим что-то типа такого:

typedef struct {
     unsigned short some_symbol;
     char symbol_one;
     int symbol_tho;
     char symbol_four;
}__attribute__((packed, aligned(1))) my_sample_struct_t;

Разницу между размерами структуры с атрибутами и без можно посмотреть sizeof(my_sample_struct_t);. Разница и будет объясняться тем, что структура упакована или нет и каково выравнивание между полями структуры.

По скорости так же возможны различия. Неупакованные структуры в случае из динамического выделения, выделяются как правило быстрее, т.к. нет требований к размеру памяти (чтобы влезала вся структура со всеми данными и чтобы было место под заполнение между полями структуры).