Dans le langage de programmation C, à partir du standard C99, restrict est un mot-clé qui peut être utilisé dans les déclarations de pointeur. Le mot-clé restrict est une déclaration d'intention donnée par le programmeur pour le compilateur. Il indique que pour la durée de vie du pointeur, seul le pointeur lui-même ou une valeur directement issue (comme ) sera utilisé pour accéder à l'objet vers lequel il pointe. Cela limite les effets de l'aliasing de pointeur, aidant aux optimisations. Si la déclaration d'intention n'est pas respectée et que l'objet est atteint par un pointeur indépendant, cela se traduira par un comportement indéfini. L'utilisation du mot-clé restrict permet, en principe, d'obtenir la même performance que le même programme écrit en Fortran. C++ n'a pas de support standard de restrict, mais de nombreux compilateurs ont des équivalents qui fonctionnent habituellement en C++ et en C, tels que restrict pour GCC et Clang , et __restrict et __declspec(restrict) pour Visual C++. Si le compilateur sait qu'il y a seulement un pointeur vers un bloc de mémoire, il peut produire un code mieux optimisé. Par exemple : void updatePtrs(size_t *ptrA, size_t *ptrB, size_t *val) { ptrA += *val; ptrB += *val; } Dans le code ci-dessus, les pointeurs ptrA, ptrB, et val peuvent se référer au même emplacement mémoire, si bien que le compilateur pourrait générer un code moins optimal : load R1 ← *val ; Charge la valeur pointé par val load R2 ← *ptrA ; Charge la valeur pointé par ptrA add R2 += R1 ; Effectuer une Addition set R2 → *ptrA ; mettre à jour la valeur pointé par ptrA De même pour ptrB, notez que val est chargé à deux reprises, parce que ptrA peut être égal à val (c'est à dire, pointe vers le même emplacement). load R1 ← *val load R2 ← *ptrB add R2 += R1 set R2 → *ptrB Toutefois, si le mot-clé restrict est utilisé et que la fonction ci-dessus est déclarée comme : void updatePtrs(size_t *restrict ptrA, size_t *restrict ptrB, size_t *restrict val); alors le compilateur est autorisé à supposer que ptrA, ptrB et val pointent vers différents emplacements et que la mise à jour d'un pointeur n'affectera pas les autres pointeurs.