Вирівнювання та розмір структури, 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) також може використовуватися для цієї мети

І тут «порожнечі», пов'язані з вирівнюванням, зникають і розмір структури різних платформах ставати однаковим.

Якщо у нас багато екземплярів структури, то відключивши вирівнювання, можна заощадити пам'ять. Негативною стороною відключення вирівнювання є те, що при цьому збільшується програмний код і час, необхідний для обробки структур.