¿Cuál es el significado de «__attribute__((pic, alineados(4))) «

Es C idioma.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;

Por favor, dígame ¿cuál es el significado de la misma,y cómo el uso de esta palabra clave.

  • Es un «tipo de atributo» .. (he encontrado que es con «C atributo de lleno» en Google. Seguramente otros al menos puede hacer tan bien!)
  • Consulte esta pregunta — aunque con aligned(4) usted probablemente no tiene mucho de qué preocuparse.
InformationsquelleAutor Aaron Lee | 2012-08-02

3 Kommentare

  1. 146

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


    Estructura de datos de alineación es la forma en que se organizan los datos y se accede en la memoria de la computadora. Consta de dos separados pero relacionados con cuestiones: la alineación de los datos y estructura de datos relleno.

    Cuando un moderno equipo lee o escribe a una dirección de memoria, se va a hacer esto en palabra del tamaño de los trozos (por ejemplo, de 4 bytes en trozos en un sistema de 32 bits). La alineación de los 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 controla la memoria.

    Para alinear los datos, puede ser necesario insertar algunos no tiene sentido bytes entre el final de la última estructura de datos y el inicio de la siguiente, que es estructura de datos relleno.


    gcc proporciona la funcionalidad para deshabilitar la estructura de relleno. yo.e para evitar estos sin sentido bytes en algunos casos. Considere la siguiente estructura:

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

    sizeof(sSampleStruct) será de 12 en lugar de 8. Debido a la estructura de relleno. Por defecto, En X86, estructuras se rellenan a la 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 utilizar __attribute__((packed, aligned(X))) insistir particular(X) tamaño de relleno. X debe ser potencias de dos. Consulte aquí

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

    por lo que la anterior especificado gcc atributo no permitir que la estructura de relleno. así que el tamaño será de 8 bytes.

    Si usted desea hacer el mismo para todas las estructuras, simplemente podemos empujar el valor de alineación de la pila utilizando #pragma

    #pragma pack(push, 1)
    
    //Structure 1
    ......
    
    //Structure 2
    ......
    
    #pragma pack(pop)
    • Si el almacén de la memoria de datos de 4 bytes trozos entonces, ¿por qué no añadir 2 bytes de relleno para el unsigned short(2 bytes de largo) ? o compilador sólo añadir bytes de relleno para el 1º y último de los miembros de la estructura ? puede usted por favor aclarar.
    • Plz consulte este también. Si usted todavía no está claro, plz vienen en busca de ayuda stackoverflow.com/questions/11772553/…
    • Quien dijo que estos bytes de relleno tienen sentido, no sabe que desalineados de acceso a datos es una rareza de la arquitectura x86. Estos bytes son necesarios para evitar excepciones: cuando el procesador intenta cargar – por decir un número entero de datos que se extiende a ambos lados de su alineación natural de la frontera.
  2. 82
    • packed significa que va a utilizar el menor espacio posible para struct Ball – es decir, que se va a meter en campos juntos sin relleno
    • aligned significa que cada struct Ball comenzará en un límite de 4 bytes, esto es, para cualquier struct Ball, su dirección puede ser dividido por 4

    Estos son GCC extensiones, no forma parte de ningún estándar de C.

  3. 14

    El atributo packed significa que el compilador no agregar relleno entre los campos de la struct. El relleno se usa generalmente para hacer campos alineados a su tamaño natural, debido a que algunas arquitecturas de imponer sanciones por no alineados acceso o no permita en todo.

    aligned(4) significa que la estructura debe estar alineado a una dirección que es divisible por 4.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea