Мы знаем, что _attribute__((__packed__))
означает (скорее всего) «не вставлять никаких отступов, чтобы ускорить работу», а также может означать «не вставлять выравнивания для сохранения выравнивания».Структура упаковки с использованием __attribute __ ((__ставляется__)) в GNU GCC
struct structure2
{
int id1 __attribute__((__packed__));
char name __attribute__((__packed__));
int id2 __attribute__((__packed__));
char c __attribute__((__packed__));
float percentage __attribute__((__packed__));
};
struct structure2 b;
printf(" \n\nsize of structure2 in bytes : %d\n", sizeof(b));// output = 20
Почему все отступы не удаляются (выход = 14)?
Прежде чем использовать расширение поставщика, обязательно прочитайте документацию (https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-g_t_0040code_007bpacked_007d-type-attribute-3509). В нем ясно сказано, что атрибут может быть привязан только к типам struct, union и enum. –
Вы хотите, чтобы 'struct' была упакована, а не отдельные поля (которые уже упакованы, поскольку они являются скалярными типами). – Olaf
Я видел этот тип структуры из http://grok2.tripod.com/structure_packing.html –