Tamaño de la estructura en C | acolchado, la alineación en struct

En este artículo, vamos a ver cuál es el tamaño de un struct en C? También vamos a aprender lo que es el relleno, la alineación proporcionada por el compilador while definir la memoria para un struct.

Lo que sabemos es que tamaño de un struct es la suma de todos los miembros de datos . Al igual que para la siguiente struct,

struct A{
int a;
int* b;
char c;
char *d;
};

Tamaño de la struct debe ser suma de todo el miembro de datos, que es: Tamaño de int un tamaño + de int * b + tamaño de char c + tamaño de char * d

Now considering the 64-bit system,
Size of int is 4 Bytes
Size of character is 1 Byte
Size of any pointer type is 8 Bytes
(Pointer size doesn't depend on what kind of data type they are pointing too)
So the size of the struct should be: (4+8+1+8)=21 Bytes

ver vamos a lo que el compilador está dando mediante el operador sizeof ().

#include <stdio.h>
struct A {
int a;
int* b;
char c;
char* d;
};
int main()
{
struct A a;
printf("Size of struct A: %lun", sizeof(struct A));
printf("Size of object a: %lun", sizeof(a));
return 0;
}

Salida:

Size of struct A: 32
Size of object a: 32

Vaya !! La salida es de 32 bytes. ¿Cómo es eso posible?

Parece que el compilador se llevó a cabo el tamaño máximo del tipo de datos y se asigna la misma memoria para todos los tipos de datos. ¿Es tan?

bien, es exactamente así, pero no es lo mismo. Por supuesto, el compilador añade el relleno y trata de alinear los miembros de datos. Así que para la estructura anterior, las miradas de alineación de datos, como a continuación,

Size of struct in C | padding, alignment in struct - 4

Por encima es la alineación de la estructura A, y por eso el tamaño de la struct es de 32 Bytes . También, el objeto A de tipo struct A es de 32 bytes.

Cómo compilador añade el relleno?

Ahora la pregunta es cómo compilador añade el relleno y alineación? El método es dependiente y compilador tipo de codiciosos. Se alinea hasta el límite de la memoria máxima que se destina. Aquí nos encontramos con que la memoria máxima asignada es de 8 bytes, por lo tanto todos los miembros de datos adquieren 8 bytes y el tamaño total es de 32 bytes. Ahora la pregunta es ¿ocurrirá cada vez de manera similar?

¿Es como el número de miembros de datos * El tamaño máximo de tipo de datos?

La respuesta es no. Compruebe la siguiente estructura que tiene los mismos miembros, pero el orden es diferente.

 struct B{
int* b;
char c;
int a;
char *d;
};

#include <stdio.h>
struct B {
int* b;
char c;
int a;
char* d;
};
int main()
{
struct B b;
printf("Size of struct B: %lun", sizeof(struct B));
printf("Size of object b: %lun", sizeof(b));
return 0;
}

Salida:

Size of struct B: 24
Size of object b: 24

En la estructura anterior, nos encontramos con que el tamaño es de 24 bytes, aunque los mismos miembros de datos se han utilizado. Esto se debe al cambio en el orden de la declaración de miembro. En este struct, la alineación y el relleno sería como a continuación:

Size of struct in C | padding, alignment in struct - 5

Por encima es la alineación de la estructura B y por eso el tamaño es de 24 bytes, en lugar de 32. Hemos visto que el compilador mantiene la alineación con avidez y por eso se alinea struct C & amp; struct una en la misma fila. Cuando se intentó alinear struct * d, podría no tan sólo quedaban 3 bytes. Pero en lugar de struct *, si era case sólo entonces se habría alineado en la misma línea.

Por lo tanto, espero que sea claro cómo se alinea compilador una estructura. Un punto a destacar es que el compilador no puede reordenar los miembros de datos a pesar de que puede haber reducido tamaño. Por lo tanto, struct A tendrá tamaño 32 bytes, no 24 Bytes.


Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *