2010-03-24 31 views
11

¿Los punteros en un sistema de 64 bits siguen alineados en 4 bytes (similar a un doble en un sistema de 32 bits)? ¿O están alineados con 8 bytes?C Alineación de punteros de 64 bits

Por ejemplo, en un sistema de 64 bits lo grande que es la siguiente estructura de datos:

struct a { 
    void* ptr; 
    char myChar; 
} 

estaría el puntero por 8 byte alineado, causando 7 bytes de relleno para el personaje (total = 8 + 8 = 16)? ¿O el puntero estará alineado con 4 bytes (4 bytes + 4 bytes) y causará 3 bytes de relleno (total = 4 + 4 + 4 = 12)?

Gracias, Ryan

+7

Por un momento, leí "C64". – Thilo

Respuesta

6

La alineación y el empaquetado de los datos son específicos de la implementación, y generalmente se pueden cambiar desde la configuración del compilador (o incluso con pragmas).

Sin embargo, suponiendo que esté utilizando la configuración predeterminada, en la mayoría de los compiladores (si no en todos), la estructura debería tener un total de 16 bytes. La razón es porque las computadoras leen un fragmento de datos con el tamaño de su tamaño de palabra nativo (que es de 8 bytes en el sistema de 64 bits). Si fuera a rellenar con compensaciones de 4 bytes, la siguiente estructura no se rellenaría adecuadamente con un límite de 64 bits. Por ejemplo, en el caso de un arr [2], el segundo elemento de la matriz comenzaría en una desviación de 12 bytes, que no está en el límite del byte nativo de la máquina.

6

no creo que puede confiar en las reglas duras y rápidas. Creo que es una función del compilador que utiliza y las opciones de compilación que elija.

Su mejor opción es escribir un programa que lo pruebe y escuche un archivo de encabezado que codifica las reglas de alineación como #define s. También es posible que simplemente pueda calcular lo que le interesa en las macros también.

3

general en un sistema de 64 bits:

struct a { 
    void* ptr;  // size is 8 bytes, alignment is 8 
    char myChar; // size is 1 byte, alignment is 1 
        // padding of 7 bytes so array elements will be properly aligned 
} 

Para un tamaño total de 16 bytes.

Pero esta es toda la implementación definida; solo estoy dando un ejemplo que probablemente sea cierto para muchos (¿la mayoría?) Sistemas de 64 bits.

0

Debería consultar la documentación para la ABI particular que le interese. Por ejemplo, aquí está the System V ABI x86-64 architeture supplement - puede ver en la página 12 que los punteros en esta ABI están alineados en 8 bytes (así que sí, la estructura show sería rellenado a 16 bytes).

1

El estándar de idioma no hace declaraciones sobre el relleno. Las reglas de alineación son específicas de la plataforma (es decir, debe alinearse de manera diferente, por ejemplo, una CPU PowerPC que en una CPU x86_64) y están definidas por la implementación, lo que significa que su compilador puede hacer lo que funcione (y puede cambiar ese comportamiento con diferentes comandos opciones de línea o después de una actualización de versión).

Creo firmemente que cualquier recomendación en el sentido de "esto es por lo general tal o cual" es engañosa, y posiblemente peligroso.

  1. Se puede escribir un programa de prueba que ejecuta un par de sizeof() y/o offsetof() declaraciones y escribe un encabezado para que contiene algunos #define s indicando los rellenos utilizados.

  2. Puede usar autoconf para hacer eso por usted.

  3. Por lo menos, debe agregar declaraciones assert(sizeof(...)) al comienzo de su función main() para que se informe cuando sus suposiciones son incorrectas.

Cuestiones relacionadas