Bytes de memoria de almacenamiento y la estructura alineado-C

  

Medio Ambiente: ubuntu64 bits + gcc
  
  

1. Cada tipo de datos que representa el tamaño de byte

  Definir una estructura hueca, a través del cual para ver el descubrimiento sizeof ocupan memoria byte 0 (vc ++ 6.0 a 1), los otros tipos de datos que el tamaño en bytes de la memoria de la fig.

#include <stdio.h>

struct Null{

};

int main()
{
	printf("int型:%ld \n",sizeof(int));
	printf("float型:%ld \n",sizeof(float));
	printf("char型:%ld \n",sizeof(char));
	printf("short型:%ld \n",sizeof(short));
	
	printf("空的struct型:%ld \n",sizeof(struct Null));
	
	return 0;
}

  Define una estructura que no está vacía, y luego observar el tamaño de bytes de memoria, el tamaño de una estructura que se encuentra en cada tipo de datos no es simplemente añadido Tamaño

#include <stdio.h>

struct Student{
	int name;    //4
	float score; //4
	char sex;    //1
	short num;   //2
};

int main()
{
	printf("struct Student字节数:%ld \n",sizeof(struct Student));
	
	return 0;
}

  Para reflejar este divertido misterio, puede desear una manera de medir una prueba para observar 1 y 2, que se encuentra que incluso si los miembros de la estructura son los mismos, pero cambió después de la clasificación, el número de bytes ocupados en los cambios; 3 y se observó 4 , flotar y flotar + Char + int realmente tan grande como

  
  

2. Los problemas de alineación de estructura

  know Accessed, la estructura de almacenamiento predeterminada empleado para número máximo de bytes para la alineación de bytes de los elementos de su forma, así llamado alineación de bytes, se refiere al tamaño de tipo de datos byte según una disposición fija, para facilitar la CPU del ordenador, la memoria se lee. Estructura tipo de datos no son la misma, esta vez alineación necesidad byte para mejorar la eficiencia de un ordenador leer
  el número de bytes el tamaño en bytes fijo, el elemento de máxima se establece por defecto estructuras compilador en el cuerpo, tales como el descrito anteriormente flotar + Char y flotan + int, de hecho, cuando se almacena int o char, se basan en cuatro bytes para almacenar, y simplemente es, después de que el valor de paso cuando las variables de índice que son un número fijo de bytes memoria de acceso
  para obtener la estructura a continuación para ilustrar

struct Student1{
	int name;    //4
	float score; //4
	char sex;    //1
	short num;   //2
};
tipo dirección 1 dirección 2 dirección 3 dirección 4
En t 1 byte 1 byte 1 byte 1 byte
flotador 1 byte 1 byte 1 byte 1 byte
Char + short 1 byte 1 byte 1 byte relleno

  Bytes correspondiente al elemento máximo es de un byte fijo, flotador por encima o int máxima variable, se 4 (el número de bytes almacenados en cada línea); para la tercera fila de carbón + corto, porque la tercera cuando el principio de la línea, después de la finalización del byte carbón de almacenamiento, y tres bytes, lo suficientemente corto como para sostener el siguiente, se puede almacenar carbón y corto en la misma línea. Línea 3 4, un total de 12 bytes.
  Para los mismos elementos de estructura 2, la siguiente memoria distribución

struct Student2{
	short num;   //2
	int name;    //4
	char sex;    //1
	float score; //4
};
tipo dirección 1 dirección 2 dirección 3 dirección 4
corto 1 byte 1 byte relleno relleno
En t 1 byte 1 byte 1 byte 1 byte
carbonizarse 1 byte relleno relleno relleno
flotador 1 byte 1 byte 1 byte 1 byte

  A principio de la primera línea de texto corto pre-existentes, 2 bytes, los dos bytes restantes no hay suficiente espacio y los próximos 4 bytes de tipo int, por lo que sólo una línea separada, similar, cuando el carac- después de la presencia de la tercera línea, los 3 bytes restantes no es suficiente tipo de espacio próximo flotador, entonces una línea separada. Cuatro filas y cuatro columnas, un total de 16 bytes. Es posible saber por qué el orden afectará el tamaño de la estructura interna del elemento de estructura
  vistazo a un ejemplo para ser apreciado apreciarse, el modo de memoria es STUDENT1 3 filas y 8 columnas, 2 filas Estudiante2 es de ocho, pero sólo en Student3 aumento Estudiante2 sobre la base de un char, se convirtió en 3 filas y 8 columnas, y los espectáculos de influencia diferente alineación de bytes de la memoria sigue siendo muy grande (señalar aquí que, si la última línea no está lleno de ocho, que deben ser llenados a 8, en la presente realización de la estructura de la tamaño de la memoria debe ser un múltiplo entero de 8, si)

  
  

3. ¿Por qué desea alinear

(1) Estructura de elementos alineados con el acceso al hardware principalmente, es decir, el hardware en sí tiene limitaciones físicas, y si la disposición de alineación aumentará la eficacia del acceso, lo que reduciría significativamente la eficiencia.

(2) en sí mismo es un dispositivo de memoria física (chips de memoria DDR, controlador DDR del SoC), sí tiene algunas limitaciones: si el acceso a la memoria cada 4-byte alineado accesos, a continuación, la eficiencia es la más alta; si la eficacia del acceso no alineado es mucho menor.

(3) hay muchos otros factores y razones para alinear el acceso que necesitamos. Algunas propiedades como Cache cache, y otro hardware (como MMU, pantallas LCD) en algunas propiedades de memoria dependiente, que tendrán acceso a los requisitos de alineación de memoria.

(4) el acceso no alineado comparativo y un acceso no alineado: el gasto de espacio de memoria de acceso no alineado, el rendimiento de la velocidad de cambio; no sacrificar el acceso no alineado rendimiento de la velocidad de acceso a cambio de un uso completo de espacio de memoria.

Resumen: Para decirlo claramente, es miembros de estructuras de acceso de alta eficiencia, es decir, los datos leídos más eficiente (pero también habrá sacrificar un poco de memoria).
  
  feliz Worth, el compilador nos ha ayudado a la alineación completa, como se mencionó anteriormente, el compilador es el número máximo predeterminado de bytes como la base para la alineación, la ventaja es aumentar la eficacia del acceso, la desventaja es parte de la memoria desperdiciada, como residuos más o menos, que es escribir el código para ordenar las variables relacionadas con
  la práctica general es que un pequeño número de variables bytes cerca como sea posible, se basan en el mismo tipo de variables juntas como esto reduciría la posible los residuos de memoria máxima medida la
  
  

4. La otra alineación de byte puede personalizarlo

  Compartir una serie de preguntas cara

Como hacer la siguiente estructura para mantener una alineación de bytes o la alineación de ocho bytes?
struct Test{ int a ; int c ; char d; };

  En el compilador, podemos establecer la alineación de una estructura por la instrucción de la alineación, hay #pragma pack () y #pragma pack (n) (n = 1/2/4/8)

  #pragma pack (n) para indicar a la estructura interna clases variable miembro compilador o desplazada con respecto a la primera dirección de una alineación variables, de forma predeterminada, el compilador alineado en fronteras naturales, si se desea variable de límite de alineación natural es mayor que la n, n alineado de acuerdo con, o alineado a un límite natural; #pragma pack () / cancelar especificar la alineación, restaurar la alineación predeterminada /

  Cuando se probó en el gráfico (en win10 + VS2019), encontró que el uso de una, la memoria estructura byte alineados 11, exactamente 4 + 4 + 2 + 1, sin el uso de la misma estructura #pragma pack Directiva, los bytes máximos predeterminados (es decir, 4 bytes) tipo; paquete #prgma de muchas maneras entornos C son compatibles, pero gcc aunque podría ser, pero no se recomienda (la cifra es en el entorno gcc)

  gcc compatible, pero no se recomienda por encima de la instrucción de alineación, los siguientes ilustración muestra, en entorno gcc, para dos estructuras diferentes, el uso de una primera alineación de 8 bytes, el segundo 4 bytes de la forma predeterminada, pero los resultados es el mismo, de acuerdo con el análisis, si un conjunto de 8-byte alineado, el tamaño de la estructura 16 debe ser como peces, por lo que el compilador puede conocer la estructura o la alineación de 4 bytes de acuerdo con el proceso de

  De la prueba de los resultados de este aspecto: en gcc, si #pragma pack especificado (N), entonces la alineación predeterminada N, N no puede superar una longitud especificada, es decir, si la alineación predeterminada es 4, entonces, el valor de n puede ser 1 2,4, 4 procesamiento como más tarde de 4. En los sistemas Windows no parece limitar este

  instrucciones de alineación gcc recomendados __attribute __ ((lleno)) y __attribute __ ((alineado (n)))

  Acción de la __attribute__ ((lleno)) está diciendo el compilador durante la compilación cancelado estructura de alineación optimizada, están alineados de acuerdo con el número real de bytes ocupados, es sintaxis GCC-específico.

  Por encima de __attribute __ ((alineado (m))) indica al compilador a una estructura o una articulación o una clase o tipo de variable (objetivo) se le asigna una alineación de direcciones cuando el espacio de direcciones. Es decir que, si el __attribute __ ((alineado m)) () acción, entonces el tipo de variable en la asignación de espacio de direcciones, la dirección que se almacena en una determinada alineación de acuerdo con un tipo de m bytes (m debe ser una potencia de dos lado). Y el espacio que ocupaba, es decir, el tamaño, es un múltiplo entero de m, en el momento de la aplicación para asegurar un espacio de memoria continuo, la dirección de cada elemento están alineados en m byte.

  A continuación demuestran, las tres estructuras son las mismas, es decir, cancelar la alineación automática de una manera byte alineado, cuando el tamaño de la estructura y el tamaño de los elementos es, el uso __attribute __ ((alineado (m))) puede ser proporcionado su alineación, dos filas 8

  
  

final

  Si mal, corregir mí todavía espero!

Publicado 17 artículos originales · ganado elogios 33 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/fengge2018/article/details/104925581
Recomendado
Clasificación