ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
24 апреля
1021993 Топик полностью
RxTx (29.07.2020 14:43, просмотров: 516) ответил LightElf на А я тебе и говорю, что неопределенное поведение упакованных структур - это изначально косяк стандартизаторов языка. Эта фича есть во всех вменяемых компиляторах с лохматых времен. Наверно она нужна зачем-то. И все ее как-то реализуют. Но пуристы в комитете предпочитают прятать голову в песок и изобретают всякую никому не нужную хрень, вместо введения упакованных структур в стандарт. С описанием их конкретного поведения в разных случаях. Например, можно указать что адрес члена
В основе языка C лежит ЯВУ (B)CPL к которому добавлены системные возможности. Структуры (record, записи) в ЯВУ могут быть представлены неупорядоченными множествами. Для несистемного языка этого вполне достаточно. В С структуры появились не сразу, первые версии были без структур и Ричи сразу планировал прямое соответствие описания структур фактическому бинарному (битовому) расположению в памяти. К тому же первые версии C создавались для CISC машин, поэтому в оригинале 

все

структуры по умолчанию "упакованные". Затем большое развитие получили RISC машины, а также скрытые RISC, архитектура которых или прямо спроектирована или более эффективно работает с данными по выравненным адресам. Это привело к тому, что поставщики компиляторов стали без предварительного объявления располагать переменные по выравненным адресам, что было совершенно прозрачно как для программиста, так и для старого, унаследованного кода. Возник вопрос, как быть с переменными в структурах? Для них чтобы не нарушать общее правило сделали так же, при этом расслабив изначальный дизайн, в котором структура бинарно отображается на память. (Вместо этого можно было сделать модификатор "fast", но произошло наоборот). Такие вещи как выравнивание, паддинг и проч. ушли в детали конкретной платформы. Вот почему стандарт языка напрямую их не описывает. Этот вопрос ушел из языка и стал деталью реализации на конкретной платформе. Компилятор и стандарт, умыли руки и отдали детали платформенной реализации. Сейчас из-за перевертыша получается так, что когда мы указываем packed, это нарушает рамки "молчания" и влечет за собой закономерную необходимость спускаться на платформозависимый уровень.


Отсюда выводы. Всё немного парадоксально :)
Представление структур - это задача _НЕ_ языка.
Закономерный способ описания этой ситуации в стандарте - хранить молчание. Это и есть описание.