Pourquoi et comment __attribute__
utilisé dans les programmes GNU C?
Pour ce que les compilateurs compatibles GCC et GCC utilisent __attribute__
la plupart des autres compilateurs utilisent #pragma
directives.
Je pense que la solution de GCC est meilleure car le comportement requis d'un _ #pragma
est de l'ignorer, alors que si vous utilisez un compilateur qui ne comprend pas un __attribute__
spécification, il ne sera pas compilé - ce qui est généralement mieux, puisque vous savez alors ce que vous devez porter.
Les spécifications d'attributs sont utilisées pour spécifier des aspects des types, des données et des fonctions tels que le stockage et l'alignement qui ne peuvent pas être spécifiés à l'aide de C.Ces éléments sont souvent spécifiques à une cible, la plupart du temps ils ne sont pas portables, certainement entre les compilateurs, et souvent entre les cibles. Évitez leur utilisation sauf lorsque cela est absolument nécessaire au bon fonctionnement du code.
Une utilisation consiste à appliquer l'alignement de la mémoire sur les variables et les membres de structure. Par exemple
float vect[4] __attribute__((aligned(16)));
S'assurera que vect
sera placé sur une limite de mémoire de 16 octets. Je ne sais pas si c'est un gcc-isme ou plus généralement applicable.
Le compilateur alignera généralement uniquement vect
sur une limite de 4 octets. Avec un alignement de 16 octets, il peut être utilisé directement avec des instructions de chargement SIMD où vous le chargeriez dans des registres 128 bits qui permettent l'addition, la soustraction, les produits scalaires et toutes sortes d'opérations vectorielles.
Parfois, vous voulez un alignement afin qu'une structure puisse être directement superposée sur des registres matériels mappés en mémoire. Ou il doit être aligné pour que le matériel puisse y écrire directement en utilisant un mécanisme d'accès direct à la mémoire (DMA).