157 votes

Quel est le sens de "__attribut__((packed, aligned(4)))) "

C'est un 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;

Veuillez me dire ce que cela signifie et comment utiliser ce mot-clé.

5 votes

Il s'agit d'un "type d'attribut" (J'ai trouvé ceci avec "C attribute packed" dans Google. D'autres peuvent sûrement faire au moins aussi bien).

1 votes

Voir cette question -- bien qu'avec aligned(4) vous n'avez probablement pas à vous inquiéter.

215voto

Jeyaram Points 4230

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


Alignement des structures de données est la manière dont les données sont organisées et accessibles dans la mémoire de l'ordinateur. Il s'agit de deux questions distinctes mais liées : alignement des données y le remplissage des structures de données .

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

Pour aligner les données, il peut être nécessaire d'insérer quelques octets sans signification entre la fin de la dernière structure de données et le début de la suivante. le remplissage des structures de données .


gcc propose une fonctionnalité permettant de désactiver le remplissage des structures, c'est-à-dire d'é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 de 12 au lieu de 8, à cause du remplissage des structures. Par défaut, dans X86, les structures sont alignées 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 rembourrage de taille particulière (X). X doit être une puissance de deux. Référer aquí

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. la taille sera donc de 8 octets.

Si l'on souhaite faire la même chose pour toutes les structures, il suffit de pousser la valeur d'alignement dans la pile en utilisant la fonction #pragma

#pragma pack(push, 1)

//Structure 1
......

//Structure 2
......

#pragma pack(pop)

117voto

cnicutar Points 98451
  • packed signifie qu'il utilisera l'espace le plus petit possible pour les struct Ball - c'est-à-dire qu'il entasse les champs sans les remplir
  • aligned signifie que chaque struct Ball commencera sur une frontière de 4 octets - c'est-à-dire que pour tout struct Ball son adresse peut être divisée par 4

Il s'agit d'extensions de GCC, qui ne font partie d'aucune norme C.

29voto

Julian Stecklina Points 100

L'attribut packed signifie que le compilateur n'ajoutera pas d'espace entre les champs de l'élément struct . Le remplissage est généralement utilisé pour aligner les champs sur leur taille naturelle, car certaines architectures imposent des pénalités pour les accès non alignés ou ne les autorisent pas du tout.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X