__restrict
Al igual que el modificador __declspec
( restrict
), la __restrict
palabra clave (dos caracteres de subrayado iniciales "_") indica que un símbolo no está con alias en el ámbito actual. La palabra clave __restrict
difiere del modificador __declspec (restrict)
en lo siguiente:
La palabra clave
__restrict
solo es válida en variables y solo__declspec (restrict)
es válido en declaraciones de función y definiciones.__restrict
es similar arestrict
para C a partir de C99 y disponible en/std:c11
modo o/std:c17
, pero__restrict
se puede usar en programas de C++ y C.Cuando se utiliza
__restrict
, el compilador no propagará la propiedad sin alias de una variable. Es decir, si se asigna una variable__restrict
a una variable que no es__restrict
, el compilador seguirá permitiendo que la variable que no es __restrict tenga un alias. Este comportamiento es diferente del de la palabra claverestrict
del lenguaje C C99.
Normalmente, si se modifica el comportamiento de una función completa, es mejor usar __declspec (restrict)
que la palabra clave.
A efectos de compatibilidad con versiones anteriores, _restrict
es un sinónimo de __restrict
a menos que se especifique la opción del compilador /Za
(Deshabilitar extensiones de lenguaje).
En Visual Studio 2015 y versiones posteriores, se puede usar __restrict
en las referencias de C++.
Nota:
Cuando se utiliza en una variable que tiene también la palabra clave volatile
, volatile
tendrá prioridad.
Ejemplo
// __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;
};