Можем ли мы сделать предположения о расположении структур? - PullRequest
3 голосов
/ 09 октября 2011

Есть ли какое-либо соглашение в отношении алгоритма, используемого для создания макетов структур на C?

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

Вот как я думаю, что он работает:

для каждогообъявленное поле (в порядке объявления)

  • Проверьте, помещается ли поле в оставшиеся байты (до следующего выравнивания)
  • Если оно не подходит, выровняйте это поле;в противном случае добавьте его к текущему смещению

, например, в 32-битной системе для такой структуры:

{
byte b1;
byte b2;
int32 i1;
byte b3;
}

будет выглядеть так с этим алгоритмом:

{
byte b1;
byte b2;
byte[2] align1;
int32 i1;
byte b3;
byte[3] align2;
}

1 Ответ

3 голосов
/ 09 октября 2011

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

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

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