2011-06-15 14 views
16
typedef union epoll_data 
{ 
    void  *ptr; 
    int   fd; 
    __uint32_t u32; 
    __uint64_t u64; 
} epoll_data_t; 

Aquí int y son de 4 bytes, mientras que los otros son 8 bytes.¿Disposición de memoria de unión de miembro de diferente tamaño?

Cuando establecemos fd en un int, ¿se encuentra en los primeros 4 bytes o los últimos 4 bytes, o depende de endianness?

Alguna razón es apreciada.

+1

En la práctica, los tipos más cortos siempre estarán al principio, pero no estoy seguro de si esto está explicado o no ... –

Respuesta

24

Se encuentra en los primeros 4 bytes. De la norma C99 §6.7.2.1/14:

El tamaño de una unión es suficiente para contener el mayor de sus miembros. El valor de como máximo uno de los miembros se puede almacenar en un objeto de unión en cualquier momento. Un puntero a un objeto de unión, convenientemente convertido, apunta a cada uno de sus miembros (o si un miembro es un campo de bits, luego a la unidad en la que reside), y viceversa.

Esto implica que la dirección de todos los miembros de una unión es la misma.

+0

No es cierto, pueden comenzar en diferentes lugares debido al relleno. Vea la Figura 3.5 en el estándar ELF vinculado a continuación. Es un ejemplo de cómo importa el orden de la declaración de campos dentro de una definición de unión/estructura. – user209051

+3

@ user209051: Incorrecto. Suponiendo que haya querido decir la figura 3-6 (3-5 es una estructura), observe que los campos de bits se representan con direcciones bajas a la derecha y direcciones altas a la izquierda. El relleno ocurre después de los miembros (con direcciones más altas). –

0

Esto realmente depende de ELF-ABI para esa plataforma. Vea ejemplos y figuras en la sección 3.1 en http://www.sco.com/developers/devspecs/abi386-4.pdf Muestra que no es necesario comenzar en una dirección baja, si hay relleno debido a restricciones de alineación.

+1

incorrecto Ver mi comentario sobre mi respuesta. El ELF ABI no es autoritativo/normativo para el lenguaje C. –

Cuestiones relacionadas