История изменений
Исправление
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);
. Разница и будет объясняться тем, что структура упакована или нет и каково выравнивание между полями структуры.
По скорости так же возможны различия. Неупакованные структуры в случае из динамического выделения, выделяются как правило быстрее, т.к. нет требований к размеру памяти (чтобы влезала вся структура со всеми данными и чтобы было место под заполнение между полями структуры).