Какова цель макетов совместимых типов?

Стандарт определяет, когда два типа совместимы с макетом. Но я нигде в стандарте не вижу, каковы будут последствия, когда два типа совместимы с макетом. Кажется, что совместимость с макетом - это определение, которое нигде не используется.

Какова цель макета, совместимого?

Примечание. Предположительно, это может означать, что типы имеют одинаковое расположение (offsetof является одинаковым для каждого соответствующего члена), поэтому, например, для тривиально копируемых типов между ними могут быть скопированы базовые байты. Но я не вижу что-то подобное в стандарте.

2 ответа

Решение

Стандарт определяет один конкретный случай, когда совместимость макета имеет значение: в unions. Если два члена совместимы с макетом, и один из них является активным union член, то вы можете получить доступ к этому объекту через указатели / ссылки на любой совместимый с макетом член этого union, Это является следствием правила "общая начальная последовательность".

Стандарт не пытается установить, что все реализации подходят для всех целей. Следовательно, качественные реализации, предназначенные для целей, выходящих за рамки тех, для которых стандарт требует поддержки, обычно должны расширять семантику языка. Один из самых простых и полезных способов сделать это - сказать, что в некоторых случаях, когда части Стандарта определяют или подразумевают поведение какого-либо действия, а другая часть говорит, что перекрывающаяся категория действий вызывает UB, они будут обрабатывать поведение как определяется или подразумевается бывшими частями. Например, во многих компиляторах есть опция (обычно включается с -fno-strict-aliasing флаг), чтобы сказать, что любая программа, поведение которой будет определено в отсутствие правил доступа типа, будет обрабатываться таким образом, даже если эти правила говорят, что программа вызывает UB.

Хотя существует относительно немного ситуаций, когда тот факт, что две структуры совместимы с компоновкой, может привести к тому, что стандарт будет определять поведение, а в противном случае это может означать, что реализация должна вести себя в отсутствие таковых. правила доступа к типу (делая невозможным для реализации что-либо еще). Например, если типы структуры T1 и T2 совместимы с компоновкой, это предполагает, что если указатель на T1 превращается в T2*любая операция с элементом структуры, использующим последний указатель, будет обращаться к соответствующему элементу T1 объект.

Поскольку не все программы нуждаются в таких способностях, Стандарт не требует, чтобы все реализации обеспечивали их. С другой стороны, реализации, которые подходят для низкоуровневого программирования, обеспечат средства, с помощью которых части кода, предназначенные для обработки одного типа, могут использоваться для взаимозаменяемой обработки типов, совместимых с компоновкой, независимо от того, требует ли это Стандарт или нет (реализации, которые не будут просто ограничены использованием, отличным от низкоуровневого программирования).

Я думаю, что Стандарт был бы значительно улучшен путем официального признания категорий реализаций, которые подходят для низкоуровневого программирования и других, которые не претендуют на это, вместо того, чтобы пытаться определить единый набор поведения для всех реализаций. Тем не менее, определение таких понятий, как "совместимость макетов", значительно расширяет диапазон конструкций, которые будут переносимы среди реализаций, подходящих для низкоуровневого программирования.

Другие вопросы по тегам