Подтвердить что ты не робот

Схема памяти объединения члена разного размера?

typedef union epoll_data
{
  void        *ptr;
  int          fd;
  __uint32_t   u32;
  __uint64_t   u64;
} epoll_data_t;

Здесь int и __uint32_t - 4 байта, а остальные - 8 байт.

Когда мы устанавливаем fd в int, лежит ли он на первых 4 байтах или последних 4 байтах или зависит от сущности?

Понятна какая-то причина.

4b9b3361

Ответ 1

Он лежит на первых 4 байтах. Из стандарта C99 §6.7.2.1/14:

Размер объединения достаточен, чтобы содержать самый большой из его членов. Значение не более одного из членов может быть сохранено в объединенном объекте в любое время. Указатель на объект объединения, соответствующим образом преобразованный, указывает на каждый из его членов (или если элемент является битовым полем, а затем блоку, в котором он находится) и наоборот.

Это означает, что адрес всех членов объединения одинаковый.

Ответ 2

Это действительно зависит от ELF-ABI для этой платформы. См. Примеры и рисунки, приведенные в разделе 3.1 в http://www.sco.com/developers/devspecs/abi386-4.pdf Это показывает, что ему не нужно начинать с низкого адреса, если есть отступы из-за ограничений выравнивания.