Resumen de aprendizaje del lenguaje C _09_ alineación de la memoria de la estructura

1. ¿Por qué hay alineación de memoria?
Hay un código a continuación

#include<stdio.h>
#include<windows.h>
struct s1
{
    
    
	char c;
	int i;
	char c1;
};
struct s2
{
    
    
	char c;
	char c1;
	int i;
};
int main()
{
    
    
	printf("%d\n", sizeof(struct s1));
	printf("%d\n", sizeof(struct s2));

	system("pause");
	return 0;
}

Inserte la descripción de la imagen aquí
Los tipos de elementos de las variables miembro en las dos estructuras son los mismos, pero los tamaños de las dos estructuras son diferentes, lo cual es muy extraño.
De hecho, cuando la CPU accede a la dirección de memoria de la estructura, hay ciertas reglas, que deben ser obedecidas ----> la alineación de memoria de la estructura
Entonces, ¿por qué hay alineación de memoria?
La mayoría de los libros y materiales de referencia dicen lo siguiente:
1. Razón de la plataforma 9 (Razón para el trasplante): No todas las plataformas de hardware pueden acceder a los datos en cualquier dirección; algunas plataformas de hardware solo pueden buscar en ciertas direcciones Algunos tipos específicos de datos, de lo contrario, una excepción de hardware será arrojado.
2. Razones de rendimiento:
las estructuras de datos (especialmente las pilas) deben alinearse con los límites naturales tanto como sea posible. La razón es que para acceder a la memoria no alineada, el procesador necesita hacer dos accesos a la memoria, mientras que la memoria alineada solo necesita un acceso.
En general: la alineación de memoria de la estructura es la práctica de intercambiar espacio por tiempo. (Debido al principio de alineación de la memoria dentro de la estructura para el acceso a la memoria, es muy probable que las dos variables miembro tengan huecos en la memoria, al igual que las diferentes disposiciones de las mismas variables miembro de las dos estructuras anteriores conducen a diferentes tamaños de la estructura)
2. Reglas de alineación de la memoria de estructura:
1. El primer miembro está en la dirección con un desplazamiento de 0 de la variable de estructura.
2. Otras variables de miembro deben alinearse con una dirección que sea un múltiplo entero de cierto número (número de alineación) . Es decir, el desplazamiento inicial puede dividir el número de alineación de manera uniforme.
El número de alineación es igual al valor más pequeño del número de alineación predeterminado del compilador (puede configurarlo usted mismo) y el tamaño de la variable miembro, ==> min (número de alineación predeterminado, tamaño de miembro).
3. El tamaño total de la estructura es un múltiplo entero del número máximo de alineación (cada variable miembro tiene un número de alineación).
Entre ellos, el tipo personalizado, como la alineación máxima de la matriz es
=> min (el tamaño de uno de los elementos, el número de alineación predeterminado del compilador), el número de alineación más grande de la estructura en sí es el más grande entre los números de alineación de sus variables miembro.
Vamos, el código, calculalo.

#include<stdio.h>
#include<windows.h>
#pragma warning(disable:4996)

//结构体的内存对齐
typedef struct s1
{
    
    
	char c1;
	int i;
	char c2;
} s1_;
typedef struct s2
{
    
    
	char c1;
	char c2;
	int i;
} s2_;
typedef struct s3
{
    
    
	double c1;
	char c2;
	int i;
} s3_;
//结构体嵌套
struct s4
{
    
    
	char c1;
	struct s3 _s3;
	double d;
};
union Un2
{
    
    
	short c[7];
	int i;
};
//可以利用联合判断当前计算机的大小端存储
union Un1
{
    
    
	char c;
	int i;
};

int main()
{
    
    
	union Un1 un;
	un.i = 1;
	int ret = un.c;
	if (1 == ret){
    
    
		printf("小端机器!\n");
	}
	else{
    
    
		printf("大端机器!\n");
	}
	printf("%d字节\n", sizeof(union Un2));
	printf("%d字节\n", sizeof(s1_));
	printf("%d字节\n", sizeof(s2_));
	printf("%d字节\n", sizeof(s3_));
	printf("%d字节\n", sizeof(struct s4));

	
	system("pause");
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/CZHLNN/article/details/110006248
Recomendado
Clasificación