агрегатный инициализатор против неявного заполнения структуры - PullRequest
0 голосов
/ 22 июля 2010

В коде, подобном следующему, у нас обычно есть неявное заполнение 2 байта в конце структуры:

struct foo {
  int32_t x ;
  int16_t y ;
// <<< 2 bytes for total sizeof(foo) == 8
} ;

Сегодня меня спросили, что делает агрегатный инициализатор с двумя дополнительными байтами:

foo o = { 0, 0 } ;

т.е. это будет эквивалентно

foo o ;
memset( &o, 0, sizeof(foo) ) ;

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

Кто-нибудь знает, говорит ли спецификация языка C о том, что делает агрегатная инициализация с неявным заполнением, когда платформе ABI требуется такое заполнение для конкретной структуры?

Ответы [ 2 ]

2 голосов
/ 22 июля 2010

Цитирование из стандарта C99, «Представление типов», 6.2.6:

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

Короче говоря, это не определено языком;все зависит от компилятора / разработчика интерфейса C.

0 голосов
/ 22 июля 2010

Я вполне уверен, что нет никаких требований относительно инициализации заполнения. Например, для реализации было бы совершенно законно добавлять заполнение в каждую структуру и хранить в ней тег, указывающий, какой тип структуры поддерживает проверку типов во время выполнения. В таком случае большинство структур будет содержать отступы, которые всегда были ненулевыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...