Requisito previo: operador sizeof en C
El tamaño de una estructura no siempre es igual a la suma del tamaño de cada miembro individual. Esto se debe al relleno agregado por el compilador para evitar problemas de alineación. El relleno solo se agrega cuando un miembro de la estructura va seguido de un miembro de mayor tamaño o al final de la estructura.
Los diferentes compiladores pueden tener diferentes restricciones de alineación, ya que los estándares de C establecen que la alineación de la estructura depende totalmente de la implementación.
Veamos los siguientes ejemplos para una mejor comprensión:
- Caso 1:
// C program to illustrate
// size of struct
#include <stdio.h>
int
main()
{
struct
A {
// sizeof(int) = 4
int
x;
// Padding of 4 bytes
// sizeof(double) = 8
double
z;
// sizeof(short int) = 2
short
int
y;
// Padding of 6 bytes
};
printf
(
"Size of struct: %ld"
,
sizeof
(
struct
A));
return
0;
}
Producción:
Size of struct: 24
La parte roja representa el relleno agregado para la alineación de datos y la parte verde representa los miembros de la estructura. En este caso, x (int) es seguido por z (doble), que es más grande en tamaño en comparación con x . Por lo tanto, el relleno se agrega después de x . Además, se necesita relleno al final para la alineación de datos. - Caso 2:
// C program to illustrate
// size of struct
#include <stdio.h>
int
main()
{
struct
B {
// sizeof(double) = 8
double
z;
// sizeof(int) = 4
int
x;
// sizeof(short int) = 2
short
int
y;
// Padding of 2 bytes
};
printf
(
"Size of struct: %ld"
,
sizeof
(
struct
B));
return
0;
}
Producción:
Size of struct: 16
En este caso, los miembros de la estructura se clasifican en orden decreciente de tamaño. Por lo tanto, solo se requiere relleno al final.
- Caso 3:
// C program to illustrate
// size of struct
#include <stdio.h>
int
main()
{
struct
C {
// sizeof(double) = 8
double
z;
// sizeof(short int) = 2
short
int
y;
// Padding of 2 bytes
// sizeof(int) = 4
int
x;
};
printf
(
"Size of struct: %ld"
,
sizeof
(
struct
C));
return
0;
}
Producción:
Size of struct: 16
En este caso, y (int corto) es seguido por x (int) y, por lo tanto, se requiere relleno después de y . No se necesita relleno al final en este caso para la alineación de datos.
El lenguaje C no permite que los compiladores reordenen los miembros de la estructura para reducir la cantidad de relleno. Para minimizar la cantidad de relleno, los miembros de la estructura deben clasificarse en orden descendente (similar al caso 2).
Publicación traducida automáticamente
Artículo escrito por rituraj_jain y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA