Unión y estructura y ocupando problemas de memoria

1. La diferencia entre struct y Union

El compilador dará espacio de memoria a todos los miembros de Struct, por lo que se pueden almacenar múltiples variables

Las variables miembro de Union comparten un espacio de memoria y solo almacenan los datos de la última variable

Primero veamos el código

Parte de unión:

unión u {     int a;     intb;     intc; };



Asignación en la función principal

    ca = 1;
    cb = 2;
    cc = 3;
    cout <<ca;

 La conclusión que se extrae es que todos los datos de las variables miembro son los últimos datos asignados, cuando se usa unión, solo se recomienda que cuando se necesite un valor, la asignación de miembro de unión reescribirá el resto de los miembros.

parte de la estructura

estructura l {     char a;     carácter b;     intc;     doble d; };




Los datos de su objeto se almacenan de forma independiente.

tamaño de la memoria (alineación de bytes)

Unión

El aspecto de la memoria es más interesante, porque la unión mencionada anteriormente solo almacena el último bit, pero nuestros tipos de datos serán diferentes, por lo que el tamaño de la unión tomará el bit más grande.

unión u {     char a;     intb;     doble c; };



en la función principal

cout << tamaño de(c);

inferido

El bit más grande es de 8 bytes de tipo doble.

unión u2
{  char a[13];  intb; };


 unión u3
{  char a[13];  carácter b; };


Si es así, la diferencia entre los dos es que los tipos de b son int y char

cout<<tamaño(u2)<endl; // 16
cout<<tamaño(u3)<<endl; // 13

Como resultado, debería ser el carácter a[13] más grande en los cálculos normales, pero los resultados son diferentes

El problema central es que el tipo int es de 4 bytes, por lo que la alineación de la memoria debe basarse en 4, mientras que char es de 1 byte.

memoria de estructura

La parte de la estructura es más complicada. Como se mencionó anteriormente, al mirar el tamaño de la memoria, debe recordar el problema de la alineación de la memoria. El cálculo específico no es sumar todos primero, sino determinar la alineación de acuerdo con el número más pequeño que se puede alinear en orden.

ejemplo:

estructura k {     char a;     doble b;     carácter c;     int d; }; estructura k2 {     char a;     carácter b;     intc;     doble d; };










int principal() 
{     ka;     k2b;

    cout << " A:" << tamaño(a) << "B:" << tamaño(b);
}

k es 24 y k2 es 16. El problema con los diferentes tamaños de los dos es que el orden es diferente. k1 busca primero, y el más grande encontrado es la clase doble, luego se alinea con 8 bits, comienza a calcular a como 0 y luego llega a 1, si desea agregar b, excederá 7, así que salte a 8 para comenzar el cálculo, dirija a 15, guarde c a 16 y continúe guardando d, el resultado es 20, para la alineación de datos El tamaño es 23, y el tamaño de la estructura es 23 (recuerda comenzar desde 0)

k2 es 16, a es de 0 a 1, b es de 1 a 2, cuando c es de tipo int, se alinea con 4 bits, porque c excederá, por lo que la alineación comienza de 4 a 7, y el almacenamiento d es de 8 bits pero también se puede alinear con 4 bytes, por lo que cuando llega a 15, el tamaño de k2 es 16

El tamaño de la memoria de la estructura está relacionado con el tipo y el orden.

 

Resumir

Hablemos primero de union y struct. Para ambos, el primero solo guarda el último valor, y su tamaño está determinado por la alineación de bytes y el tipo de datos más grande. El último strcut proporcionará espacio para todas las variables, y el tamaño de la memoria también estará relacionado con el orden de los tipos almacenados, que es más importante.

Pegue el tamaño del tipo de datos, donde 32 o 64 dígitos solo son diferentes para punteros y largos (los datos provienen de aquí)

Nota:
1. La longitud es de 8 bytes en Linux y de 4 bytes en Windows.
2. El tamaño de la cadena: las cadenas de 32 y 64 bits tienen una diferencia de 4 bytes, que en realidad es una diferencia de puntero. La cadena no guarda la cadena en sí, pero guarda un puntero al principio de la cadena.

 

 

Supongo que te gusta

Origin blog.csdn.net/hoxidohanabi/article/details/127986499
Recomendado
Clasificación