limitado (AMP de C++)
El especificador de la restricción se puede aplicar para trabajar y declaraciones lambda.Impone restricciones en el código de la función y en el comportamiento de la función en aplicaciones que utilizan C++ acelerado runtime de Massive Parallelism (AMP de C++).
[!NOTA]
Para obtener información sobre la palabra clave restrict que forma parte de los atributos de clase de almacenamiento __declspec , vea restrict.
La cláusula restrict toma los formatos siguientes:
Cláusula |
Descripción |
---|---|
restrict(cpu) |
La función puede usar el lenguaje completo de C++.Sólo otras funciones declaradas mediante las funciones limitadas (CPU) pueden llamar a la función. |
restrict(amp) |
La función puede utilizar el subconjunto del lenguaje C++ que el AMP de C++ puede acelerar. |
Una secuencia restrict(cpu) y restrict(amp). |
La función debe observar las limitaciones restrict(cpu) y restrict(amp).La función puede llamar a las funciones declaradas mediante restrict(cpu), restrict(amp), restrict(cpu, amp), o restrict(amp, cpu). El formulario restrict(A) restrict(B) puede escribirse como restrict(A,B). |
Comentarios
La palabra clave restrict es una palabra clave contextual.Los especificadores, cpu y amp de restricción no son palabras reservadas.La lista de especificadores no es extensible.Una función que no tiene una cláusula restrict es igual que una función con la cláusula restrict(cpu) .
Una función que tiene la cláusula restrict(amp) tiene las siguientes limitaciones:
La función puede llamar a funciones con la cláusula restrict(amp) .
La función debe ser inlinable.
La función puede declarar únicamente int, unsigned int, float, y las variables double , y las clases y estructuras que sólo contienen estos tipos.bool también se permite, pero debe ser 4 byte- alineado si lo utiliza en un tipo compuesto.
Las funciones lambda no pueden capturar por referencia y no pueden capturar punteros.
Las referencias y los punteros de solo- direccionamiento indirecto solo se admiten como variables locales, argumentos de función, y tipos de valor devuelto.
Los siguientes no se permiten:
Recursividad.
Variables declaradas con la palabra clave volatile .
Funciones virtuales.
Punteros a funciones.
Punteros a funciones miembro.
Punteros en estructuras.
Punteros a punteros.
Instrucciones degoto .
Instrucciones etiquetadas.
try, catch, o instrucciones throw .
Variables globales.
Variables estáticas.Utilice palabra clave tile_static en su lugar.
Conversiones dedynamic_cast .
Operador typeid.
declaraciones asm.
Varargs.
Para obtener una descripción de las limitaciones de la función, vea (amp) Restricciones limitado.
Ejemplo
El ejemplo siguiente se muestra cómo utilizar la cláusula restrict(amp) .
void functionAmp() restrict(amp) {}
void functionNonAmp() {}
void callFunctions() restrict(amp)
{
// int is allowed.
int x;
// long long int is not allowed in an amp-restricted function. This generates a compiler error.
// long long int y;
// Calling an amp-restricted function is allowed.
functionAmp();
// Calling a non-amp-restricted function is not allowed.
// functionNonAmp();
}