web-dev-qa-db-fra.com

Quel est le sens de "__attribute __ ((emballé, aligné (4)))"

C'est le langage C. Il est écrit 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;

Dites-moi quelle est sa signification et comment utiliser ce mot clé.

113
Aaron Lee

Avant de répondre, j'aimerais vous donner quelques données de Wiki


L'alignement de la structure des données indique la manière dont les données sont organisées et accessibles dans la mémoire de l'ordinateur. Il comporte deux problèmes distincts mais liés: alignement des données et remplissage de la structure des données .

Lorsqu'un ordinateur moderne lit ou écrit sur une adresse de mémoire, il le fait en morceaux de la taille de Word (par exemple, des morceaux de 4 octets sur un système 32 bits). L'alignement des données signifie que les données sont placées dans un décalage mémoire égal à un multiple de la taille du mot, qui augmente les performances du système grâce à la manière dont le processeur gère la mémoire.

Pour aligner les données, il peut être nécessaire d’insérer des octets sans signification entre la fin de la dernière structure de données et le début de la suivante, ce qui correspond à .


gcc fournit un moyen d'éviter le rembourrage de la structure. C'est-à-dire pour éviter ces octets sans signification dans certains cas. Considérons la structure suivante

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

}sSampleStruct;

sizeof(sSampleStruct) sera 12 plutôt que 8. En raison du remplissage de la structure. Par défaut, sous X86, les structures sont complétées pour un alignement sur 4 octets.

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

}sSampleStruct;

Nous pouvons utiliser __attribute__((packed, aligned(X))) pour insister sur un remplissage de la taille (X). X devrait être des pouvoirs de deux. Reportez-vous ici

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

}__attribute__((packed, aligned(1))) sSampleStruct;  

l'attribut gcc spécifié ci-dessus n'autorise donc pas le remplissage de la structure. donc la taille sera de 8 octets.

Si vous souhaitez faire la même chose pour toutes les structures, nous pouvons simplement pousser la valeur d'alignement à empiler en utilisant #pragma

#pragma pack(Push, 1)

//Structure 1
......

//Structure 2
......

#pragma pack(pop)
140
Jeyaram
  • packed signifie qu'il utilisera le plus petit espace possible pour struct Ball - c'est-à-dire qu'il s'agglomérera de champs sans remplissage
  • aligned signifie que chaque struct Ball commencera sur une limite de 4 octets - c'est-à-dire que pour tout struct Ball, son adresse peut être divisée par 4

Ce sont des extensions GCC, qui ne font partie d'aucune norme C.

77
cnicutar

L'attribut packed signifie que le compilateur n'ajoutera pas de remplissage entre les champs de la variable struct. Le rembourrage est généralement utilisé pour créer des champs alignés sur leur taille naturelle, car certaines architectures imposent des pénalités pour les accès non alignés ou ne le permettent pas du tout.

aligned(4) signifie que la structure doit être alignée sur une adresse divisible par 4.

13
Julian Stecklina