Эквивалентен ли размер объекта размеру другого на основе того же выравнивания и / или представления? - PullRequest
0 голосов
/ 11 июля 2020

Стандартные состояния C (подчеркните мой):

28 Указатель на void должен иметь те же требования к представлению и выравниванию, что и указатель на символ. type. 48) Аналогично, указатели на квалифицированные или неквалифицированные версии совместимых типов должны иметь одинаковые требования к представлению и выравниванию. Все указатели на структурные типы должны иметь одинаковые требования к представлению и выравниванию. Все указатели на типы объединения должны иметь одинаковые требования к представлению и выравниванию. Указатели на другие типы не обязательно должны иметь одинаковые требования к представлению или выравниванию.

48) Те же требования к представлению и выравниванию подразумевают взаимозаменяемость в качестве аргументов функций, возвращаемых значений из функций и членов объединений. .

Источник: C11, §6.2.5 / 28

Здесь часто встречается формулировка « такое же представление и выравнивание ».

Но как насчет того же размера?

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

Или, другими словами: есть ли гарантия, что если выравнивание и / или представление равны, размер будет таким же?

Вопрос :

  • Эквивалентен ли размер одного объекта размеру другого на основе того же выравнивания и / или представления?

Аннотации:

  • Вопрос не касается c только объектов-указателей. Указатели были просто ссылкой на мое мышление, поскольку это хороший пример.

  • Цитаты из стандарта приветствуются. В принятом ответе должны быть цитаты из стандарта.

  • Параметр точно такой же, как и конкретная реализация c. Я не говорю о различных выравниваниях / представлениях / размерах объектов в разных реализациях.

Соответствующие (относительно примера указателя):

Ответы [ 2 ]

2 голосов
/ 11 июля 2020

Два типа с одинаковым представлением не подразумевают, что два типа должны иметь одинаковые требования к выравниванию, хотя на практике это часто верно.

Представление означает, что одинаковое значение объекта представлен одинаковыми байтами в том же порядке. Выравнивание сообщает, на что должен делиться адрес младшего байта в типе.

1 голос
/ 11 июля 2020

C Пункт 6.2.6 2018 г., озаглавленный «Представления типов», определяет представления типов. В параграфе 2 говорится:

За исключением битовых полей, объекты состоят из непрерывных последовательностей из одного или нескольких байтов, количество, порядок и кодировка которых либо указаны явно, либо определены реализацией.

Отсюда ясно, что представление объекта - это последовательность байтов, и эта последовательность имеет некоторое количество байтов, некоторый порядок и некоторую кодировку. Таким образом, количество байтов, порядок байтов и кодировка байтов являются частью представления. Следовательно, если два объекта имеют одинаковое представление, они имеют одинаковое количество байтов, один и тот же порядок и одинаковую кодировку.

Поскольку они имеют одинаковое количество байтов, они имеют одинаковый размер.

Например, если объект X представлен байтами A, B и C, а объект Y представлен байтами A, B, C и D, то X и Y не имеют такое же представление.

...