2012-06-19 12 views
5

El tipo de cada miembro de la estructura generalmente tiene una alineación predeterminada, es decir, cada miembro de la estructura está alineado en un límite predeterminado. Por esta razón, el relleno se realiza en el siguiente ejemplo wiki:¿Por qué favorecer la alineación de la estructura de datos?

struct MixedData 
{ 
    char Data1; 
    short Data2; 
    int Data3; 
    char Data4; 
}; 



struct MixedData /* After compilation in 32-bit x86 machine */ 
{ 
    char Data1; /* 1 byte */ 
    /* 1 byte for the following 'short' to be aligned on a 2 byte boundary 
assuming that the address where structure begins is an even number */ 
    char Padding1[1]; 
    short Data2; /* 2 bytes */ 
    int Data3; /* 4 bytes - largest structure member */ 
    char Data4; /* 1 byte */ 
    char Padding2[3]; /* 3 bytes to make total size of the structure 12 bytes */ 
}; 

¿Cuál es la (práctica) por lo que la alineación debe ser preservado?

+0

posible duplicado de [¿Por qué C++ no ajusta la estructura?] (Http://stackoverflow.com/questions/6730664/why-doesnt-c-make-the-structure-tighter) –

+2

Consulte este enlace. Le ayudará a comprender cómo la alineación permite el acceso rápido. http://www.geeksforgeeks.org/archives/9705 –

Respuesta

8

Las lecturas y escrituras desalineadas generalmente requieren que la CPU busque las dos palabras adyacentes de la memoria (en lugar de solo una) y que aplique aritmética bit a bit adicional para realizar la operación designada correctamente.

Algunas arquitecturas, como x86, lo permitirán a un costo de rendimiento. Otras arquitecturas (más notablemente ARM) lanzarán una excepción (que normalmente da como resultado una señal SIGBUS para un proceso de usuario) o incluso "redirigirán" la dirección al límite más cercano, lo que podría provocar errores muy desagradables.

+2

Además, e importante para la programación simultánea, el acceso no alineado no puede hacerse atómico, mientras que uno alineado puede hacerlo. –

9

En muchas arquitecturas, las lecturas y escrituras alineadas desde y hacia la memoria principal son mucho más rápidas que sus contrapartes no alineadas.

+9

Y en algunos, el acceso no alineado está prohibido. – osgx

+4

en algunas arquitecturas incluso resultarán en una excepción si el compilador no genera código para trabajar alrededor de lecturas/escrituras no alineadas – mensi

+2

En la mayoría de arquitecturas, un acceso que abarca dos páginas dará como resultado una excepción MMU y el manejo de dicho caso es un servicio del sistema operativo . Un compilador sin garantías de alineación no podría producir un kernel sin mucho esfuerzo de programador. – Potatoswatter

2

Normalmente, la estructura se alinea en una alineación dependiente del procesador para permitir el acceso a ellos lo más rápido posible con el tamaño de registro natural de los procesadores.

Para procesadores de 32 bits, es de 4 bytes (o 32 bits), para procesadores de 64 bits es de 8 bytes.

Algunos procesadores (no x86) generarán un error si intenta acceder (digamos) un int si no está alineado en el límite correcto.

La comunicación entre diferentes dispositivos es una razón práctica para preservar la alineación. Con la alineación predeterminada, esta estructura tendría una longitud de 24 bytes, mientras que en un procesador de 64 bits, sería de 48 bytes, y ninguno de los elementos, excepto el primero, estaría en el mismo lugar.

Normalmente es posible cambiar el relleno de la estructura con una directiva de compilación/pragma que puede anular la necesidad del relleno manual especificado en el ejemplo, pero eso es típicamente diferente para cada compilador.

Cuestiones relacionadas