2010-07-22 4 views
0

В коде, как в дальнейшем мы, как правило, имеют неявный подушечка 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)) ; 

У меня не было ни малейшего понятия, поэтому я рекомендовал не зависеть от этого (совокупные исходники все равно неприятны, так что это хорошая рекомендация для ИМО).

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

+1

странный, просто мысленный эксперимент, или это влияет на проект? я бы предположил, что он не загружается, хотя на вашем компиляторе есть, вероятно, какая-то версия '#pragma pack', чтобы удалить дополнение и сделать его эквивалентным ... – eruciform

ответ

2

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

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

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

0

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

Смежные вопросы