Проблемы выравнивания памяти с объединением
Есть ли гарантия, что память для этого объекта будет правильно выровнена, если мы создадим объект этого типа в стеке?
union my_union
{
int value;
char bytes[4];
};
Если мы создадим в стеке символьные байты [4], а затем попробуем привести его к целому числу, может возникнуть проблема с выравниванием. Мы можем избежать этой проблемы, создав ее в куче, однако есть ли такая гарантия для объектов объединения? По логике это должно быть, но я хотел бы подтвердить.
Благодарю.
2 ответа
Ну, это зависит от того, что вы имеете в виду.
Если ты имеешь ввиду:
Будет ли
int
а такжеchar[4]
члены союза должны быть правильно выровнены, чтобы я мог использовать их независимо друг от друга?
Тогда да. Если ты имеешь ввиду:
Будет ли
int
а такжеchar[4]
члены должны быть выровнены так, чтобы занимать одинаковое количество места, чтобы я мог получить доступ к отдельным байтамint
сквозьchar[4]
?
Тогда нет. Это потому что sizeof(int)
не гарантируется равным 4. Если int
s 2 байта, то кто знает, какие два char
элементы будут соответствовать int
в вашем union
(стандарт не указывает)?
Если вы хотите использовать объединение для доступа к отдельным байтам int
, использовать этот:
union {
int i;
char c[sizeof(int)];
};
Поскольку каждый член имеет одинаковый размер, они гарантированно занимают одинаковое пространство. Это то, о чем, я полагаю, вы хотите знать, и я надеюсь, что ответил на это.
Да, в противном случае профсоюзы были бы совершенно бесполезны.