Какова цель макетов совместимых типов? - PullRequest
0 голосов
/ 29 октября 2018

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

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

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

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

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

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

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

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

0 голосов
/ 29 октября 2018

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

...