В основе языка C лежит ЯВУ (B)CPL к которому добавлены системные
возможности. Структуры (record, записи) в ЯВУ могут быть
представлены неупорядоченными множествами. Для несистемного языка
этого вполне достаточно. В С структуры появились не сразу, первые
версии были без структур и Ричи сразу планировал прямое
соответствие описания структур фактическому бинарному (битовому)
расположению в памяти. К тому же первые версии C создавались для
CISC машин, поэтому в оригинале все
структуры по умолчанию "упакованные". Затем большое развитие получили RISC машины, а также скрытые RISC, архитектура которых или прямо спроектирована или более эффективно работает с данными по выравненным адресам. Это привело к тому, что поставщики компиляторов стали без предварительного объявления располагать переменные по выравненным адресам, что было совершенно прозрачно как для программиста, так и для старого, унаследованного кода. Возник вопрос, как быть с переменными в структурах? Для них чтобы не нарушать общее правило сделали так же, при этом расслабив изначальный дизайн, в котором структура бинарно отображается на память. (Вместо этого можно было сделать модификатор "fast", но произошло наоборот). Такие вещи как выравнивание, паддинг и проч. ушли в детали конкретной платформы. Вот почему стандарт языка напрямую их не описывает. Этот вопрос ушел из языка и стал деталью реализации на конкретной платформе. Компилятор и стандарт, умыли руки и отдали детали платформенной реализации. Сейчас из-за перевертыша получается так, что когда мы указываем packed, это нарушает рамки "молчания" и влечет за собой закономерную необходимость спускаться на платформозависимый уровень.
Отсюда выводы. Всё немного парадоксально :)
Представление структур - это задача _НЕ_ языка.
Закономерный способ описания этой ситуации в стандарте - хранить молчание. Это и есть описание.