Compartilhar via


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 runtime do C++ Accelerated Massive Parallelism(AMP C++).

Observação

Para obter informações sobre a palavra-chave restrict que faz parte dos atributos de classe de armazenamento __declspec, confira restrict.

A cláusula 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çõesgoto .

    • Instruções rotuladas.

    • Instruções try, catch ou throw.

    • Variáveis globais.

    • Variáveis estáticas. Use tile_static palavra-chave.

    • Conversões dynamic_cast.

    • O operador typeid.

    • Declarações asm.

    • Varargs.

Para uma descrição das limitações da função, confira 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();
}

Confira também

C++ AMP (C++ Accelerated Massive Parallelism)