Quelle est la signification de " attribut ((emballé, aligné (4))) "

C'est C language.It 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 quelle est la signification de celui-ci, et comment utiliser ce mot-clé.

93
c gcc
demandé sur Mawg 2012-08-02 06:59:30

3 réponses

Avant de répondre, je voudrais vous donner quelques données de Wiki


L'alignement de la structure de données {[12] } est la façon dont les données sont disposées et accessibles dans la mémoire de l'ordinateur. Il se compose de deux questions distinctes, mais interdépendantes: alignement des données et structure de données de remplissage.

Quand un ordinateur moderne lit ou écrit à une adresse mémoire, il le fera en morceaux de taille word (par exemple des morceaux de 4 octets sur un système 32 bits). l'alignement des Données moyens mettre les données à 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 façon 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, qui est remplissage de structure de données.


Gcc fournit une facilité pour éviter le remplissage de la structure. c'est-à-dire pour éviter ces octets insignifiants dans certains cas. Envisager l' structure suivante

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

}sSampleStruct;

sizeof(sSampleStruct) sera 12 plutôt que 8. En raison de la structure de rembourrage. Par défaut, dans X86, les structures seront rembourrées à l'alignement de 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 particulier(X). X devrait être des puissances de deux. Référez-vous à ici

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

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

Ainsi, l'attribut gcc spécifié ci-dessus n'autorise 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, simplement nous pouvons appuyez sur la valeur d'alignement pour empiler en utilisant #pragma

#pragma pack(push, 1)

//Structure 1
......

//Structure 2
......

#pragma pack(pop)
117
répondu Jeyaram 2017-05-23 11:54:56
  • packed signifie qu'il utilisera le plus petit espace possible pour struct Ball - c'est-à-dire qu'il va entasser les champs ensemble sans remplissage
  • aligned signifie que chaque struct Ball commencera sur une frontière d'octet 4 - c'est à dire pour tout struct Ball, son adresse peut être divisé par 4

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

66
répondu cnicutar 2012-08-06 15:52:23

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

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

11
répondu Julian Stecklina 2013-06-20 16:14:48