2016-10-10 2 views
0
  1. Элементы структуры должны быть правильно выровнены, поэтому структура может быть дополнена неиспользуемыми байтами.
  2. Размер структуры всегда один и тот же (поскольку это постоянное выражение).

Так что я полагаю, компилятор должен каким-то образом использовать тот же отступы каждый раз, когда такие, как:Является ли заполнение в структурах одинаковым?

  • размещения одного STRUCT экземпляра
  • передавая экземпляр структуры по значению функции
  • возвращающая-структуру экземпляр по значению от функции
  • в массиве структур

Если я прав с этой презумпцией, не могли бы вы указать мне, что говорит C-стандарт? Существуют ли какие-либо строгие правила для размещения дополнений, которые гарантируют это свойство?

+0

Do вы имеете в виду «Все ли экземпляры структуры в одной программе имеют один и тот же макет»? –

+2

Задание и выравнивание определяются реализацией. Он может варьироваться между компиляторами и даже между одним и тем же компилятором на разных платформах. –

+0

Теоретически макет может меняться между различными прогонами программы –

ответ

0

C блокирует то, что смещения полей в конкретном типе структуры с помощью спецификации offsetof макросъемки, в 7.17 из this version проекта, который описывает необходимые макросы в <stddef.h>.

макросы

NULL 

который расширяется к реализации определенных констант нулевой указатель; и

offsetof(type, member-designator) 

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

static type t; 

то выражение &(t.member-designator) вычисляется в константу адреса. (Если указанный элемент представляет собой битовое поле, поведение не определено.)

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

+0

У меня нет доступной для поиска ссылки в финальной версии стандарта, но если у кого-то есть, и он перемещен или по существу изменен, отредактируйте мой ответ, добавьте правильное местоположение. –

+1

Я так и ожидал ответа, но комментарии к этому вопросу меня просто испугали, отметив, что нет разницы между временем компиляции и временем выполнения в стандартном и постоянным выражением - по крайней мере, с точки зрения языка - _can change_ во время выполнения – Amomum