Es lenguaje C. Está escrito que:
typedef struct __attribute__((packed, aligned(4))) Ball {
float2 delta;
float2 position;
//float3 color;
float size;
//int arcID;
//float arcStr;
} Ball_t;
Ball_t *balls;
Dígame cuál es su significado y cómo usar esta palabra clave.
aligned(4)
probablemente no tenga mucho de qué preocuparse.Respuestas:
Antes de responder, me gustaría darle algunos datos de Wiki
La alineación de la estructura de datos es la forma en que los datos se organizan y acceden en la memoria de la computadora. Se compone de dos cuestiones distintas pero relacionadas: la alineación de datos y los datos de estructura de relleno .
Cuando una computadora moderna lee o escribe en una dirección de memoria, lo hará en fragmentos de tamaño de palabra (por ejemplo, fragmentos de 4 bytes en un sistema de 32 bits). La alineación de datos significa colocar los datos en un desplazamiento de memoria igual a un múltiplo del tamaño de la palabra, lo que aumenta el rendimiento del sistema debido a la forma en que la CPU maneja la memoria.
Para alinear los datos, puede ser necesario insertar algunos bytes sin sentido entre el final de la última estructura de datos y el comienzo de la siguiente, que es el relleno de la estructura de datos .
gcc proporciona funcionalidad para deshabilitar el relleno de estructura. es decir, para evitar estos bytes sin sentido en algunos casos. Considere la siguiente estructura:
sizeof(sSampleStruct)
será 12 en lugar de 8. Debido a la estructura de relleno. De forma predeterminada, en X86, las estructuras se rellenarán con una alineación de 4 bytes:Podemos usar
__attribute__((packed, aligned(X)))
para insistir en el relleno de tamaño particular (X). X debe ser potencia de dos. Consulte aquíentonces el atributo gcc especificado arriba no permite el relleno de la estructura. entonces el tamaño será de 8 bytes.
Si desea hacer lo mismo para todas las estructuras, simplemente podemos empujar el valor de alineación para apilar usando
#pragma
fuente
packed
significa que usará el espacio más pequeño posiblestruct Ball
, es decir, agrupará los campos sin rellenoaligned
significa que cada unostruct Ball
comenzará en un límite de 4 bytes, es decir, para cualquierastruct Ball
, su dirección se puede dividir por 4Estas son extensiones GCC, no forman parte de ningún estándar C.
fuente
El atributo
packed
significa que el compilador no agregará relleno entre los campos destruct
. El relleno generalmente se usa para alinear los campos a su tamaño natural, porque algunas arquitecturas imponen penalizaciones por acceso no alineado o no lo permiten en absoluto.aligned(4)
significa que la estructura debe estar alineada con una dirección que es divisible por 4.fuente