Reglas de alineación de memoria de estructura C / C ++ reglas de alineación de memoria de estructura

Reglas de alineación de memoria de estructura

1. ¿Qué es la alineación de memoria de estructura?

        La estructura no es como una matriz. Se pueden almacenar diferentes tipos de datos en la estructura. Su tamaño no es simplemente la suma del tamaño de cada miembro de datos. Se limita al requisito de leer la memoria, pero el almacenamiento de cada miembro en la memoria debe ser Se almacena en un cierto desplazamiento. De acuerdo con diferentes tipos, cada miembro debe estar alineado y almacenado de acuerdo con un cierto número de alineación. Finalmente, el tamaño de toda la estructura debe estar alineado de acuerdo con un cierto número de alineación.

En segundo lugar, las reglas de alineación.

  1. El primer miembro está en una dirección que tiene un desplazamiento de 0 de la variable de estructura.
  2. Otras variables miembro deben alinearse con una dirección que sea un múltiplo entero del número de alineación (número de alineación = el número de alineación predeterminado del compilador y el valor más pequeño del tamaño del miembro).
  3. El valor predeterminado en Linux es 4, y el valor predeterminado en vs es 8.
  4. El tamaño total de la estructura es un múltiplo entero del número de alineación máximo (cada variable de miembro, excepto el primer miembro tiene un número de alineación).

        Si una estructura está anidada, la estructura anidada se alinea a un múltiplo entero de su número máximo de alineación, y el tamaño general de la estructura es un múltiplo entero de todos los números máximos de alineación (incluido el número de alineación de la estructura anidada)

Caracteristicas:

  1. El desplazamiento de cada miembro% número de alineación propio = 0
  2. El tamaño total de la estructura% La alineación máxima de todos los miembros = 0
  3. El número de alineación de la estructura es el número de alineación máximo entre los números de alineación de sus propios miembros.

3. Ejemplos

// 平台VS2013下(默认对齐数为8)
// 案例一
    struct S1
    {
        char c1;
        int i;
        short s2;
    };
    printf("%d\n", sizeof(struct S1)); // 12
// 案例二
    struct S2
    {
        char c1;
        short s2;
        int i;
    };
    printf("%d\n", sizeof(struct S2)); // 8
  
  
Análisis del caso uno

        El tipo char ocupa 1 byte, el número de alineación predeterminado del compilador es 8, luego el número de alineación variable es 1, el desplazamiento real es 0. El
        tipo int ocupa 4 bytes, el número de alineación predeterminado del compilador es 8, luego la alineación variable Dígito 4, el desplazamiento debe ser un múltiplo de 4, el desplazamiento real es 4, el
        tipo corto ocupa 2 bytes, la alineación predeterminada del compilador es 8, luego la alineación variable es 2, el desplazamiento debe ser un múltiplo de 2, El desplazamiento real es 8. El
        número de alineación general de la estructura es el mayor de todos los miembros. El número de alineación es 4 el
tamaño general de la estructura. Según el tamaño del espacio ocupado por los datos anteriores, el tamaño de la estructura se calcula en 10 bytes.
        De acuerdo con la regla de alineación, debe alinearse con un múltiplo de 4, el tamaño real es de 12 bytes

Análisis del caso dos

        El tipo char ocupa 1 byte, el número de alineación predeterminado del compilador es 8, luego el número de alineación variable es 1, el desplazamiento real es 0, el
        tipo corto ocupa 2 bytes y el número de alineación predeterminado del compilador es 8, luego la alineación variable Número 2, el desplazamiento debe ser un múltiplo de 2, el desplazamiento real es 2
        int tipo ocupa 4 bytes, el número de alineación predeterminado del compilador es 8, luego la variable está alineada con el dígito 4, el desplazamiento debe ser un múltiplo de 4, El desplazamiento real es 4 El
        número de alineación general de la estructura es el mayor de todos los miembros. El número de alineación         es el tamaño general de la
estructura 4. Según el tamaño del espacio ocupado por los datos anteriores, el tamaño de la estructura es de 8 bytes.
        De acuerdo con la regla de alineación, debe alinearse con un múltiplo de 4, el tamaño real es de 8 bytes

Análisis gráfico

Alineación de la memoria

Cuarto, ¿por qué hay alineación de memoria?

La portabilidad de la plataforma es buena

        No todas las plataformas de hardware pueden acceder a los datos en cualquier dirección; algunas plataformas de hardware solo pueden acceder a ciertos tipos de datos en ciertas direcciones, de lo contrario se generan excepciones de hardware y los límites no alineados no están directamente involucrados. Lee los datos.

Alta eficiencia de procesamiento de la CPU

Escriba una descripción de la imagen aquí

Como se puede ver en la figura anterior, correspondiente a los dos métodos de almacenamiento, si la granularidad de lectura de la CPU es de 4 bytes,

  1. Luego, para un tipo int, si se almacena de acuerdo con la alineación de la memoria, el procesador solo necesita acceder a la memoria una vez para leer 4 bytes
  2. Si no se lee según la memoria, como se muestra en la figura anterior, debe acceder a la memoria dos veces para leer una variable de tipo int completa
  3. El proceso específico es: sacar 4 bytes por primera vez, descartar el primer byte, sacar 4 bytes por segunda vez, descartar los últimos tres bytes y luego juntar los datos int completos .

La alineación de la memoria de estructura es la práctica de intercambiar espacio por tiempo. Mejorar la eficiencia

Publicado 32 artículos originales · ganado elogios 1 · vistas 4551

Supongo que te gusta

Origin blog.csdn.net/hezhanran/article/details/104558955
Recomendado
Clasificación