- Union es un tipo que puede almacenar diferentes tipos de datos en el mismo espacio de almacenamiento.
- La longitud de la memoria ocupada por la unión es igual a la longitud de su miembro más largo.
- El mismo segmento de memoria se puede utilizar para almacenar varios tipos diferentes de miembros, pero solo una función a la vez.
- El miembro activo en la variable de unión es el último miembro almacenado y el valor del miembro original se sobrescribirá después de que se almacene un nuevo miembro.
- La dirección de la variable de unión y las direcciones de sus miembros son la misma dirección.
union var
{
double a;
float b;
int c;
short d;
char f;
}var;
int main()
{
printf("%d\n",sizeof(var));
}
/*
结果是8;符合联合体所占的内存长度等于其长度最长成员的长度
*/
union var
{
double a;
float b;
int c;
short d;
char arr[12];
}var;
int main()
{
printf("%d\n",sizeof(var));
}
/*
结果是16;涉及内存对齐
最长的数据类型是double,占8个字节,arr占了12个字节,但是要和double对齐,占用内存是8的倍数,也就是16.
*/
Las similitudes y diferencias entre unión y estructura: Similitudes:
Ambos pueden contener muchos tipos de datos y variables.
diferencia:
- Estructura: la asignación de memoria de estructura se le asigna a usted, ya sea que la use o no.
- Consorcio: ahorre memoria,
por ejemplo :
#include <iostream>
using namespace std;
union vars
{
double a; //8
float b; //4
int c; //4
short d; //2
char f[12]; //12
}var;
struct stus
{
double a; //8
float b; //4
int c; //4
short d; //2
char f[12]; //12
}stu;
int main()
{
printf("%d\n",sizeof(var)); //结果是16
printf("%d\n",sizeof(stu)); //结果是32
return 0;
}
La imagen de arriba es fácil de entender.
Para la unión, primero busque el tipo de datos que ocupa el byte más grande en la unión. Double ocupa 8 bytes y luego encuentre el miembro que ocupa el espacio más grande es arr, que ocupa 12 bytes. Si el espacio ocupado es 8 Multiple, el resultado es 16.
Para la estructura, el tamaño de la memoria asignada es mayor o igual que la suma de la memoria ocupada por los miembros de datos. Descubra que el miembro de datos más grande en la estructura ocupa 8 bytes, la suma de la memoria ocupada por la estructura es 30 y el complemento de memoria es un múltiplo de 8 y finalmente 32.
ps: En cuanto al factor de alineación, cada compilador en una plataforma específica tiene su propio "factor de alineación" predeterminado, que también se puede cambiar con el comando de precompilación #pragma pack (n), n = 1,2,4,8,16 Este coeficiente, donde n es el "coeficiente de alineación" que desea especificar.
Primero deje el agujero y luego escriba una discusión detallada.