__restrict
Comme le __declspec
modificateur ( restrict
) modificateur, le __restrict
mot clé (deux traits de soulignement principaux '_') indique qu’un symbole n’est pas alias dans l’étendue actuelle. Le __restrict
mot clé diffère du __declspec (restrict)
modificateur de la manière suivante :
Le
__restrict
mot clé est valide uniquement sur les variables et__declspec (restrict)
n’est valide que sur les déclarations de fonction et les définitions.__restrict
est similaire àrestrict
C à partir de C99 et disponible en/std:c11
mode,/std:c17
mais__restrict
peut être utilisé dans les programmes C++ et C.Lorsqu’il
__restrict
est utilisé, le compilateur ne propage pas la propriété no-alias d’une variable. Autrement dit, si vous affectez une__restrict
variable à une variable non-variable__restrict
, le compilateur autorise toujours l’alias de la variable non-__restrict. Cela diffère du comportement du mot clé de langagerestrict
C99 C.
En règle générale, si vous souhaitez affecter le comportement d’une fonction entière, utilisez __declspec (restrict)
plutôt que le mot clé.
Pour la compatibilité avec les versions précédentes, _restrict
est un synonyme de __restrict
, sauf si l’option du compilateur /Za
(Désactiver les extensions de langage) est spécifiée.
Dans Visual Studio 2015 et versions ultérieures, __restrict
vous pouvez utiliser des références C++.
Remarque
Lorsqu’elle est utilisée sur une variable qui a également le volatile
mot clé, volatile
elle est prioritaire.
Exemple
// __restrict_keyword.c
// compile with: /LD
// In the following function, declare a and b as disjoint arrays
// but do not have same assurance for c and d.
void sum2(int n, int * __restrict a, int * __restrict b,
int * c, int * d) {
int i;
for (i = 0; i < n; i++) {
a[i] = b[i] + c[i];
c[i] = b[i] + d[i];
}
}
// By marking union members as __restrict, tell compiler that
// only z.x or z.y will be accessed in any given scope.
union z {
int * __restrict x;
double * __restrict y;
};