web-dev-qa-db-fra.com

__attribute__ in GNU C

Pourquoi et comment __attribute__ utilisé dans les programmes GNU C?

48
sud03r

Attributs GCC:

  • Attributs de fonction décrits ici
  • Attributs variables décrits ici
  • Attributs de type décrits ici
35
qrdl

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.

27
Clifford

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).

17
George Phillips