¿Cuál es el significado de “__tribuir __ ((empaquetado, alineado (4)))”

Es el 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.

Antes de responder, me gustaría darte algunos datos de Wiki


La alineación de la estructura de datos es la forma en que se organizan los datos y se accede a ellos en la memoria de la computadora. Consiste en dos problemas separados pero relacionados: alineación de datos y relleno de la estructura de datos .

Cuando una computadora moderna lee o escribe en una dirección de memoria, lo hará en fragmentos de tamaño de palabra (por ejemplo, trozos de 4 bytes en un sistema de 32 bits). La alineación de datos significa poner los datos en un desplazamiento de memoria igual a un múltiplo del tamaño de 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 inicio de la siguiente, que es el relleno de la estructura de datos .


gcc proporciona la facilidad para evitar el relleno de la estructura. es decir, para evitar estos bytes sin sentido en algunos casos. Considere la siguiente estructura

 typedef struct { char Data1; int Data2; unsigned short Data3; char Data4; }sSampleStruct; 

sizeof(sSampleStruct) será 12 en lugar de 8. Debido al relleno de la estructura. De forma predeterminada, en X86, las estructuras se rellenarán con una alineación de 4 bytes.

 typedef struct { char Data1; //3-Bytes Added here. int Data2; unsigned short Data3; char Data4; //1-byte Added here. }sSampleStruct; 

Podemos usar __attribute__((packed, aligned(X))) para insistir en un relleno de tamaño particular (X). X debe ser poderes de dos. Consulte aquí

 typedef struct { char Data1; int Data2; unsigned short Data3; char Data4; }__attribute__((packed, aligned(1))) sSampleStruct; 

por lo que el atributo gcc especificado anteriormente 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 astackr usando #pragma

 #pragma pack(push, 1) //Structure 1 ...... //Structure 2 ...... #pragma pack(pop) 
  • packed significa que utilizará el espacio más pequeño posible para struct Ball , es decir, replegará los campos juntos sin relleno
  • aligned significa que cada struct Ball comenzará en un límite de 4 bytes, es decir, para cualquier struct Ball , su dirección se puede dividir por 4

Estas son extensiones de GCC, que no forman parte de ningún estándar de C.

El atributo packed significa que el comstackdor no agregará relleno entre los campos de la struct . El relleno generalmente se usa para alinear los campos con su tamaño natural, ya que algunas architectures imponen penalizaciones por el acceso desalineado o no lo permiten.

aligned(4) significa que la estructura debe estar alineada con una dirección divisible por 4.