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;
Veuillez me dire quelle en est la signification et comment utiliser ce mot-clé.
aligned(4)
vous n'avez probablement pas grand-chose à craindre.Réponses:
Avant de répondre, j'aimerais vous donner quelques données du Wiki
L'alignement de la structure des données est la manière dont les données sont organisées et accessibles dans la mémoire de l'ordinateur. Il se compose de deux problèmes distincts mais liés: l'alignement des données et le remplissage de la structure des données .
Lorsqu'un ordinateur moderne lit ou écrit sur une adresse mémoire, il le fera par blocs de la taille d'un mot (par exemple, des blocs de 4 octets sur un système 32 bits). L'alignement des données signifie placer les données à un décalage de mémoire égal à un certain 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 le remplissage de la structure de données .
gcc fournit des fonctionnalités pour désactiver le remplissage de structure. c'est-à-dire pour éviter ces octets sans signification dans certains cas. Considérez la structure suivante:
sizeof(sSampleStruct)
sera 12 au lieu de 8. En raison du rembourrage de la structure. Par défaut, dans X86, les structures seront complétées à un alignement sur 4 octets: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érez-vous icidonc l'attribut gcc spécifié ci-dessus ne permet pas le remplissage de la structure. donc la taille sera de 8 octets.
Si vous souhaitez faire de même pour toutes les structures, nous pouvons simplement pousser la valeur d'alignement à empiler en utilisant
#pragma
la source
packed
signifie qu'il utilisera le plus petit espace possible pourstruct Ball
- c'est-à-dire qu'il entassera les champs ensemble sans remplissagealigned
signifie que chacunstruct Ball
commencera sur une limite de 4 octets - c'est-à-dire que pour toutstruct Ball
, son adresse peut être divisée par 4Ce sont des extensions GCC, qui ne font partie d'aucun standard C.
la source
L'attribut
packed
signifie que le compilateur n'ajoutera pas de remplissage entre les champs dustruct
. Le remplissage est généralement utilisé pour aligner les champs sur leur taille naturelle, car certaines architectures imposent des pénalités pour un accès non aligné ou ne le permettent pas du tout.aligned(4)
signifie que la structure doit être alignée sur une adresse divisible par 4.la source