intrinsic
pragma
Especifica que as chamadas para as funções especificadas na lista de argumentos do pragma são intrínsecas.
Sintaxe
#pragma intrinsic(
function_1 [,
function_2 ... ])
Comentários
O intrinsic
pragma diz ao compilador que uma função tem um comportamento conhecido. O compilador pode chamar a função e não substituir a chamada de função pelas instruções embutidas, se isso resultar em um melhor desempenho.
As funções da biblioteca com formas intrínsecas estão listadas abaixo. Após um intrinsic
pragma ser considerado, ele entre em vigor na primeira definição de função que contém uma função intrínseca especificada. O efeito continua até o final do arquivo de origem ou até o aparecimento de um function
pragma que especifique a mesma função intrínseca. O intrinsic
pragma pode ser usado apenas para uma definição de função no nível global.
As seguintes funções têm formas intrínsecas e as formas intrínsecas são usadas quando você especifica /Oi
:
Os programas que usam funções intrínsecas são mais rápidos porque não têm a sobrecarga das chamadas de função. No entanto, eles podem ser maiores devido ao código adicional gerado.
Exemplo específico do x86
Os intrínsecos _disable
e _enable
geram instruções no modo kernel para desabilitar/habilitar interrupções e podem ser úteis nos drivers do modo kernel.
Compile o código a seguir na linha de comando com cl -c -FAs sample.c
e verifique sample.asm
para ver que eles se transformam em CLI e STI de instruções x86:
// pragma_directive_intrinsic.cpp
// processor: x86
#include <dos.h> // definitions for _disable, _enable
#pragma intrinsic(_disable)
#pragma intrinsic(_enable)
void f1(void) {
_disable();
// do some work here that should not be interrupted
_enable();
}
int main() {
}
Funções de ponto flutuante intrínsecas
Essas funções de ponto flutuante não têm formas intrínsecas verdadeiras. Em vez disso, elas têm versões que passam argumentos diretamente para o chip de ponto flutuante em vez enviá-los para a pilha do programa:
Essas funções de ponto flutuante têm formas intrínsecas verdadeiras quando você especifica /Oi
e /fp:fast
(ou qualquer opinião que inclua /Oi
: /Ox
, /O1
e /O2
):
Você pode usar /fp:strict
ou /Za
para substituir a geração de opções de ponto flutuante intrínsecas verdadeiras. Nesse caso, as funções são geradas como rotinas de biblioteca que passam argumentos diretamente para o chip de ponto flutuante em vez de enviá-los para a pilha do programa.
Consulte #pragma function
para obter informações e um exemplo de como habilitar/desabilitar intrínsecos para um bloco de texto de origem.
Confira também
Pragmadiretivas e as __pragma
palavras-chave e _Pragma
Intrínsecos do compilador