Проблемы выравнивания памяти с объединением

Есть ли гарантия, что память для этого объекта будет правильно выровнена, если мы создадим объект этого типа в стеке?

union my_union
{
  int value;
  char bytes[4];
};

Если мы создадим в стеке символьные байты [4], а затем попробуем привести его к целому числу, может возникнуть проблема с выравниванием. Мы можем избежать этой проблемы, создав ее в куче, однако есть ли такая гарантия для объектов объединения? По логике это должно быть, но я хотел бы подтвердить.

Благодарю.

2 ответа

Решение

Ну, это зависит от того, что вы имеете в виду.

Если ты имеешь ввиду:

Будет ли int а также char[4] члены союза должны быть правильно выровнены, чтобы я мог использовать их независимо друг от друга?

Тогда да. Если ты имеешь ввиду:

Будет ли int а также char[4] члены должны быть выровнены так, чтобы занимать одинаковое количество места, чтобы я мог получить доступ к отдельным байтам int сквозь char[4]?

Тогда нет. Это потому что sizeof(int) не гарантируется равным 4. Если ints 2 байта, то кто знает, какие два char элементы будут соответствовать int в вашем union (стандарт не указывает)?

Если вы хотите использовать объединение для доступа к отдельным байтам int, использовать этот:

union {
  int i;
  char c[sizeof(int)];
};

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

Да, в противном случае профсоюзы были бы совершенно бесполезны.

Другие вопросы по тегам