Цитата(Golikov A. @ May 12 2014, 10:40)

Что-то я совсем потерялся....
Что в процах с 32 битным выравниванием данных прямые бездумные обращения к памяти чреваты - это точно. В таких процах создание массивов элементов размера не кратного 32 битам и бездумное обращение с ними как с памятью - тоже чревато.
А вот объяснения и примера я чет хорошего придумать не могу%(.... вы все врем меня стандартами языка придавливаете

....
Вы почему-то путаете невыровненный доступ CPU и работу си-компиляторов со структурами.
Это две не относящиеся друг к другу вещи.
Во всех примерах, что я привел
нигде нет невыровненного доступа. Даже в случаях с пакованными структурами.

В случае с пакованной структурой, вы указываете (величиной паковки в pack()) инструкциями какой максимальной длины
следует обращаться к элементам структуры.
Таким образом, чтение элемента T::a
#pragma pack(push, 1)
struct T { u32 a; };
#pragma pack(pop)
на ARM7/9 будет осуществляться 4-мя байтовыми LDRB с последующей склейкой байт в u32.
Для:
#pragma pack(push, 2)
struct T { u32 a; };
#pragma pack(pop)
на ARM7/9 сгенерит две LDRH с последующей склейкой в u32.
Для Cortex-M3 компилятор имеет право сгенерить в обоих случаях одну невыровненную LDR (если, как указал уважаемый
Сергей Борщ,
соответствующий бит разрешает невыровненный доступ) (не помню уж - есть-ли такая настройка в опциях компилёра, чтобы указать ему состояние этого бита).
А может он просто - поступает так же, как для ARM7/9. Не помню.
Так что в обоих случаях - с пакованными и непакованными структурами никаких проблем нет.
Проблема возникает только когда вы обманываете компилятор - подсовываете адрес в указатель на структуру и выравнивание этого адреса не соответствует
выравниванию структуры. Выравнивание непакованной структуры всегда равно выравниванию максимального её члена, выравнивание пакованной - не превышает
величины паковки.
PS: Я кстати стараюсь не пользоваться пакованными структурами. А там, где это нужно (например - для описания форматов кадров протоколов обмена),
предпочитаю в качестве членов структур, размер которых превышает выравнивание структуры, использовать свои типы данных, реализованные классами с
соответствующими методами доступа к ним.
В таком случае не возникает проблем с указателями на пакованные структуры в компиляторе.
И что ещё более важно - такие описания структур легко переносятся между разными компиляторами, так как не привязаны к прагмам, которые в разных компиляторах = разные.