Le mot-clé restrict est un spécificateur pour les pointeurs introduit dans la norme C99. Il informe le compilateur qu'un pointeur est le moyen unique d'accès à un objet mémoire dans la portée du pointeur. Cela aide considérablement l'optimiseur à générer un code machine plus efficace, notamment lors de la manipulation de gros tampons.
Par exemple:
void vector_add(int * restrict a, int * restrict b, int * restrict c, size_t n) { for (size_t i = 0; i < n; ++i) c[i] = a[i] + b[i]; }
Ici, on suppose que les tableaux a, b et c ne se chevauchent pas. Le non-respect de cette exigence entraîne un comportement indéfini et des erreurs difficiles à détecter.
L'utilisation de restrict est recommandée uniquement lorsque vous êtes sûr qu'aucun autre pointeur ou voie latérale ne pointe vers la même mémoire.
Une même valeur mémoire peut-elle être visible simultanément à travers deux pointeurs restrict ?
Réponse:
Non, cela entraînera un comportement indéfini. Il n'y a aucune garantie que le compilateur prenne en compte les modifications apportées via le deuxième pointeur. Exemple — code gravement erroné:
void f(int * restrict x, int * restrict y) { x[0] = 1; y[0] = 2; } int main() { int v; f(&v, &v); // Violation de la condition restrict }
Histoire
Dans le noyau de calcul financier, des fonctions ont optimisé des tableaux avec l'ajout de restrict, mais ont négligé le fait que les tableaux pouvaient se chevaucher en fonction de certaines logiques métier. Cela a conduit à un calcul incorrect des soldes lors d'une utilisation inappropriée.
Histoire
La méthode de multiplication matricielle par lot a été accélérée après l'application de restrict, mais lors d'une des itérations, le tableau de résultats se chevauchait avec l'un des tableaux d'entrée — la réponse devenait imprévisible, le bogue n'était détecté que lors des tests de charge.
Histoire
Dans l'une des fonctions de traitement d'image, deux pointeurs vers des morceaux du même tampon ont été accidentellement déclarés avec restrict. Après la mise à jour du compilateur et de son optimiseur, le résultat du traitement des images est devenu soudainement déformé — la raison : le compilateur a commencé à réutiliser activement le cache et a ignoré les modifications.