Схема памяти объединения разного размера члена? - PullRequest
20 голосов
/ 15 июня 2011
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 байта, или это зависит от порядка байтов?

По какой-то причине приветствуется.

Ответы [ 2 ]

30 голосов
/ 15 июня 2011

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

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

Это означает, что адрес всех членов профсоюза один и тот же.

0 голосов
/ 15 июня 2011

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

...