Aprendizaje de lengua C: union union

  • 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.
Inserte la descripción de la imagen aquí
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.
Inserte la descripción de la imagen aquí
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.

Supongo que te gusta

Origin blog.csdn.net/Yang_1998/article/details/106480231
Recomendado
Clasificación