Можем ли мы рассчитывать на структуру C с хорошим поведением? - PullRequest
1 голос
/ 27 февраля 2011

Можем ли мы предсказать, как структура C будет реализована компилятором?

Если я напишу (очень плохо выровненную) структуру:

struct {
  uint16_t a;
  uint32_t b;
  uint8_t c;
} s;

char *p = (char*)&s;

могу ли я гарантировать, что p[6] совпадает с s.c? Распределяются ли поля структуры таким наиболее очевидным и каноническим образом, чтобы мы могли предсказать, где каждое поле будет в памяти?

Редактировать: struct __attribute__ ((__packed__)) {...} s; даст мне такое поведение в GCC?

Ответы [ 5 ]

7 голосов
/ 27 февраля 2011

Поля должны быть расположены в порядке возрастания, но компилятор может свободно вставлять отступы между полями так, как считает нужным, поэтому нет гарантии, какое значение n в p[n] будет ссылаться на s.c. OTOH, вы можете получить правильное смещение, используя offsetof(s,c).

7 голосов
/ 27 февраля 2011

Нет, вы не можете.Не делайте этого.

Вам гарантирован только порядок, и один и тот же компилятор всегда будет делать одну и ту же компоновку.

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

2 голосов
/ 27 февраля 2011

Даже с атрибутом __packed__ получить это выравнивание может быть невозможно из-за архитектурных ограничений.Например, если для uint32_t требуется 4-байтовое выравнивание, оно будет иметь смещение 4 даже при __packed__.

Если вам нужно принять конкретное выравнивание, установите статическую проверку, которая помешает кодукомпиляция с другим выравниванием.

1 голос
/ 27 февраля 2011

Для заданной версии компилятора в данной версии операционной системы - и с теми же параметрами сборки = да

Но не надо!

0 голосов
/ 27 февраля 2011

См. #pragma pack(packed) и #pragma pack(reset). Он имеет то же влияние, что и атрибут GCC __packed__, который вы упомянули.

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