Схема памяти объединения члена разного размера?
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 байтах или зависит от сущности?
Понятна какая-то причина.
Ответы
Ответ 1
Он лежит на первых 4 байтах. Из стандарта C99 §6.7.2.1/14:
Размер объединения достаточен, чтобы содержать самый большой из его членов. Значение не более одного из членов может быть сохранено в объединенном объекте в любое время. Указатель на объект объединения, соответствующим образом преобразованный, указывает на каждый из его членов (или если элемент является битовым полем, а затем блоку, в котором он находится) и наоборот.
Это означает, что адрес всех членов объединения одинаковый.
Ответ 2
Это действительно зависит от ELF-ABI для этой платформы. См. Примеры и рисунки, приведенные в разделе 3.1 в http://www.sco.com/developers/devspecs/abi386-4.pdf Это показывает, что ему не нужно начинать с низкого адреса, если есть отступы из-за ограничений выравнивания.