Вирівнювання та розмір структури, MainLoop
Є у нас, припустимо, структура.
Але якщо на різних платформах (наприкладavr іarm ) виконати наступний код
printf("розмір структури %u\r\n", sizeof( struct my_struct ) );
ми отримаємо різні результати. Дляarm розмір структури дорівнює 12, а дляavr дорівнює 5. Чому?
На перший погляд, тому що змінні типуint на різних платформах мають різну розрядність. Дляarm це 4 байти, дляavr 2 байти.
Перепишемо нашу структуру.
Типshort має розмір 2 байти на всіх платформах.
Але ми знову отримуємо різний розмір структури дляarm 6 байт, дляavr 5 байт.
Але як бути, якщо ми хочемо передати структуру з однієї платформи на іншу.
Усунути поведінку за умовчанням і прибрати вирівнювання можна, якщо вказати атрибутpacked при описі структури, директива компілятора#pragma pack(1) також може використовуватися для цієї мети
І тут «порожнечі», пов'язані з вирівнюванням, зникають і розмір структури різних платформах ставати однаковим.
Якщо у нас багато екземплярів структури, то відключивши вирівнювання, можна заощадити пам'ять. Негативною стороною відключення вирівнювання є те, що при цьому збільшується програмний код і час, необхідний для обробки структур.