Partilhar via


Intrínsecos do compilador

A maioria das funções está contida em bibliotecas, mas algumas funções são incorporadas (ou seja, intrínsecas) ao compilador. Estas são referidas como funções intrínsecas ou intrínsecas.

Observações

Se uma função é intrínseca, o código para essa função é geralmente inserido em linha, evitando a sobrecarga de uma chamada de função e permitindo que instruções de máquina altamente eficientes sejam emitidas para essa função. Um intrínseco é muitas vezes mais rápido do que a montagem em linha equivalente, porque o otimizador tem um conhecimento interno de quantos intrínsecos se comportam, portanto, algumas otimizações podem estar disponíveis que não estão disponíveis quando a montagem em linha é usada. Além disso, o otimizador pode expandir o intrínseco de forma diferente, alinhar buffers de forma diferente ou fazer outros ajustes, dependendo do contexto e dos argumentos da chamada.

O uso de intrínsecos afeta a portabilidade do código, porque intrínsecos que estão disponíveis no Microsoft C++ podem não estar disponíveis se o código for compilado com outros compiladores e alguns intrínsecos que podem estar disponíveis para algumas arquiteturas de destino não estão disponíveis para todas as arquiteturas. No entanto, os intrínsecos são geralmente mais portáteis do que a montagem em linha. Os intrínsecos são necessários em arquiteturas de 64 bits onde a montagem em linha não é suportada.

Alguns intrínsecos, como __assume e __ReadWriteBarrier, fornecem informações ao compilador, o que afeta o comportamento do otimizador.

Alguns intrínsecos estão disponíveis apenas como intrínsecos, e alguns estão disponíveis tanto em implementações de função quanto intrínsecas. Você pode instruir o compilador a usar a implementação intrínseca de uma de duas maneiras, dependendo se você deseja habilitar apenas funções específicas ou se deseja habilitar todas as intrínsecas. A primeira maneira é usar #pragma intrinsic(intrinseca-função-nome-lista). O pragma pode ser usado para especificar um único intrínseco ou múltiplos intrínsecos separados por vírgulas. O segundo é usar a opção de compilador /Oi (Gerar funções intrínsecas), que disponibiliza todos os intrínsecos de uma determinada plataforma. Em /Oi, use #pragma function(intrinsic-function-name-list) para forçar uma chamada de função a ser usada em vez de uma intrínseca. Se a documentação para um intrínseco específico observa que a rotina só está disponível como intrínseca, então a implementação intrínseca é usada independentemente de /Oi ou #pragma intrinsic é especificada. Em todos os casos, /Oi ou #pragma intrinsic permite, mas não força, o otimizador a usar o intrínseco. O otimizador ainda pode chamar a função.

Algumas funções de biblioteca C/C++ padrão estão disponíveis em implementações intrínsecas em algumas arquiteturas. Ao chamar uma função CRT, a implementação intrínseca é usada se /Oi for especificado na linha de comando.

Um arquivo de cabeçalho, <intrin.h>, está disponível que declara protótipos para as funções intrínsecas comuns. Intrínsecas específicas do <fabricante estão disponíveis nos arquivos de cabeçalho immintrin.h> e <ammintrin.h> . Além disso, determinados cabeçalhos do Windows declaram funções que são mapeadas em um compilador intrínseco.

As seções a seguir listam todos os intrínsecos que estão disponíveis em várias arquiteturas. Para obter mais informações sobre como os intrínsecos funcionam no seu processador de destino específico, consulte a documentação de referência do fabricante.

Consulte também

Referência do montador ARM
Referência do Microsoft Macro Assembler
Palavras-chave
Referência de biblioteca de tempo de execução C