Que signifie le mot-clé « Restrict » en C ?
Le mot-clé restrict en C (une syntaxe pré-C 14 valable uniquement comme une extension GCC) spécifie que deux ou plusieurs pointeurs passés à une fonction ne pointent pas vers une mémoire qui se chevauche régions.
Standard C99
En C99, restrict est destiné à optimiser le code en permettant aux compilateurs de supposer que les pointeurs ne se créeront pas d'alias. Cela peut entraîner des améliorations significatives des performances en permettant des optimisations telles que le déroulement de boucle et la vectorisation, comme le montre l'exemple suivant :
void f(int *a, int *b, int *x) { *a += *x; *b += *x; } void fr(int *__restrict__ a, int *__restrict__ b, int *__restrict__ x) { *a += *x; *b += *x; }
Sans restriction, deux instructions d'assemblage sont nécessaires pour charger la valeur de « x » pour « a » et « b », mais avec restrict, la valeur de « x » n'est chargée qu'une seule fois.
GCC Optimisation
GCC peut exploiter restrict pour optimiser le code, comme le démontre le code assembleur suivant :
f: mov (%rdx),%eax add %eax,(%rdi) mov (%rdx),%eax add %eax,(%rsi) fr: mov (%rdx),%eax add %eax,(%rdi) add %eax,(%rsi)
Dans cet exemple, la fonction 'fr' optimisée avec restrict a un de moins instruction d'assemblage que le «f» non optimisé function.
Arrays
Restrict peut être particulièrement utile lorsqu'il s'agit d'arguments de pointeur qui font référence à des tableaux, permettant aux compilateurs d'optimiser des opérations telles que memset et memcpy, améliorant potentiellement les performances.
Exemple de tableau
void f(char *restrict p1, char *restrict p2, size_t size) { for (size_t i = 0; i < size; i++) { p1[i] = 4; p2[i] = 9; } }
Avec restreindre, ceci le code peut être optimisé pour utiliser memset pour une plus grande efficacité. La suppression de la restriction désactiverait cette optimisation, entraînant un comportement incorrect si les tableaux se chevauchent.
Règle d'alias stricte
La restriction ne s'applique qu'aux pointeurs de types compatibles, en raison de la stricte règle d'alias. La conversion d'un type incompatible en un type valide rompra le contrat de restriction, conduisant potentiellement à un comportement indéfini.
Extensions GCC
GCC permet également d'utiliser restrict avec des références et fonctions membres, étendant la portée de ses capacités d'optimisation.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!