проблемы выравнивания памяти с объединением - PullRequest
3 голосов
/ 21 декабря 2010

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

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

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

Спасибо.

Ответы [ 2 ]

3 голосов
/ 21 декабря 2010

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

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

Будут ли оба члена союза 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)];
};

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

2 голосов
/ 21 декабря 2010

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

...