"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué "sizeof(myStruct)" devuelve 6 bytes en lugar de 8 bytes para una estructura con tres miembros "cortos sin firmar"?

¿Por qué "sizeof(myStruct)" devuelve 6 bytes en lugar de 8 bytes para una estructura con tres miembros "cortos sin firmar"?

Publicado el 2024-11-18
Navegar:579

Why does `sizeof(myStruct)` return 6 bytes instead of 8 bytes for a struct with three `unsigned short` members?

Alineación de la memoria en estructuras C: comprensión de la discrepancia de tamaño

Cuando se trabaja con estructuras C, la alineación de la memoria desempeña un papel crucial a la hora de determinar la tamaño de la estructura en la memoria. La alineación de la memoria se refiere a la ubicación de estructuras de datos en direcciones de memoria que son divisibles por límites específicos. Esto garantiza un acceso eficiente a los datos y una optimización del rendimiento.

Considere una máquina de 32 bits donde la alineación de la memoria normalmente se establece en 4 bytes. En este contexto, una estructura compuesta por varios miembros cortos sin firmar, como:

typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
} myStruct;

Uno esperaría que el tamaño de la memoria de esta estructura fuera de 8 bytes (3 x 2 bytes). Sin embargo, el operador sizeof(myStruct) devuelve sólo 6 bytes. Esta discrepancia se puede atribuir al requisito de alineación.

En el primer ejemplo, cada miembro corto ocupa 2 bytes. Dado que el límite de alineación es de 4 bytes, no se inserta ningún relleno entre los miembros. Por lo tanto, el tamaño total permanece en 6 bytes.

Por el contrario, introducir un miembro int en la estructura, como se ve a continuación, altera el comportamiento de alineación:

typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
    int i;
} myStruct;

En este caso, el miembro int requiere un límite de alineación de 4 bytes. Para garantizar el cumplimiento de este requisito, se insertan 2 bytes de relleno entre el último miembro corto sin firmar (v3) y el miembro int (i). Esto da como resultado un tamaño total de 12 bytes (6 bytes de datos en shorts, 2 bytes de relleno y 4 bytes de datos en int).

Por lo tanto, la diferencia en el tamaño de la memoria entre las dos estructuras surge de los requisitos de alineación de sus tipos de miembros. En la primera estructura, los propios miembros cortos alcanzan el límite de alineación, mientras que en la segunda estructura, se requiere relleno adicional para cumplir el límite de alineación del miembro int.

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3