restrita (C++ AMP)
O especificador de restrição pode ser aplicado a declarações de função e lambda. Impõe restrições no código na função e no comportamento da função em aplicativos que usam o tempo de execução do C++ Accelerated Massive Parallelism(AMP C++).
Dica
Para obter informações sobre a palavra-chave restrict que faz parte dos atributos de classe de armazenamento __declspec, consulte restrict.
A cláusula de restrict usa os seguintes formas:
Cláusula |
Descrição |
---|---|
restrict(cpu) |
A função pode usar a linguagem C++ completa. Somente outras funções que são declaradas usando as funções restrict(cpu) podem chamar a função. |
restrict(amp) |
A função só pode usar o subconjunto da linguagem C++ que o AMP C++ pode acelerar. |
Uma sequência de restrict(cpu) e restrict(amp). |
A função deve atender às limitações de restrict(cpu) e restrict(amp). A função pode ser chamada por funções que são declaradas usando restrict(cpu), restrict(amp), restrict(cpu, amp) ou restrict(amp, cpu). A forma restrict(A) restrict(B) pode ser escrita como restrict(A,B). |
Comentários
A palavra-chave restrict é uma palavra-chave contextual. Os especificadores de restrição cpu e amp não são palavras reservadas. A lista de especificadores não é extensível. Uma função que não tem uma cláusula restrict é igual a uma função que tem a cláusula restrict(cpu).
Uma função que tem a cláusula restrict(amp) tem as seguintes limitações:
A função só pode chamar funções que tenham a cláusula restrict(amp).
A função deve ser embutível.
A função pode declarar somente as variáveis int, unsigned int, float e double, e classes e estruturas que contenham apenas esses tipos. bool também é permitido, mas também deve ser alinhado com 4 bytes se você usá-lo em um tipo composto.
As funções lambda não podem capturar por referência nem capturar os ponteiros.
As referências e ponteiros de indireção única só têm suporte como variáveis locais, argumentos de função e tipos de retorno.
Os seguintes não são permitidos:
Recursão.
Variáveis declaradas com a palavra-chave volatile.
Funções virtuais.
Ponteiros para funções.
Ponteiros para funções de membro.
Ponteiros em estruturas.
Ponteiros para ponteiros.
Instruções goto.
Instruções rotuladas.
Instruções try, catch ou throw.
Variáveis globais.
Variáveis estáticas. Use Palavra-chave tile_static em seu lugar.
Conversões dynamic_cast.
O operador typeid.
Declarações asm.
Varargs.
Para obter uma descrição das limitações da função, consulte Restrições de restrict(amp).
Exemplo
O exemplo a seguir mostra como usar a 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();
}