Поделиться через


intrinsic

Указывает, что функции, заданные в списка аргументов этой директивы, вызываются как встроенные.

#pragma intrinsic( function1 [, function2, ...] )

Заметки

Директива #pragma intrinsic указывает компилятору, что поведение функции известно. Компилятор может вызвать функцию и не заменять вызов функции подставляемыми инструкциями, если это позволит повысить производительность.

Ниже перечислены функции библиотеки со встроенными формами. Объявленная директива #pragma intrinsic начинает применяться для первого определения функции, в котором содержится заданная встроенная функция. Ее действие продолжается до конца исходного файла или до появления директивы #pragma function, задающей ту же самую встроенную функцию. Директива #pragma function может использоваться только за пределами определения функции — на глобальном уровне.

Следующие функции имеют встроенные формы, которые используются, если задан параметр /Oi:

_disable

_outp

fabs

strcmp

_enable

_outpw

labs

strcpy

_inp

_rotl

memcmp

strlen

_inpw

_rotr

memcpy

 

_lrotl

_strset

memset.

 

_lrotr

abs

strcat

 

Программы, в которых используются встроенные функции, выполняются быстрее, поскольку они не порождают дополнительную нагрузку, связанную с вызовом функций. Однако они могут иметь больший размер, поскольку в них создается дополнительный код.

Специфика для платформы x86

Встроенные функции _disable и _enable создают инструкции режима ядра, включающие и отключающие прерывания. Они могут использоваться в драйверах, работающих в режиме ядра.

Пример

Скомпилируйте следующий код из командной строки с параметрами "cl -c -FAs sample.c" и просмотрите файл sample.asm. Вы увидите, что в нем включены инструкции CLI и STI для процессоров 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() {
}

Специфика для платформы x86 — окончание

Функции с плавающей запятой, перечисленные ниже, не имеют полноценных встроенных форм. Однако у них есть версии, позволяющие передавать аргументы напрямую в микросхему операций с плавающей запятой, а не помещать их в стек программы:

acos

cosh

pow

tanh

asin

fmod

sinh

 

Если задан параметр /Oi, /Og и /fp:fast (или любой параметр, в котором содержится параметр /Og: /Ox, /O1 и /O2), то у следующих функций имеются полноценные встроенные формы:

atan

exp

log10

sqrt

atan2

log

sin

tan

cos

 

 

 

Чтобы отключить создание полноценных вариантов функций с плавающей запятой, установите параметр компилятора /fp:strict или /Za. В этом случае функции будут создаваться как библиотечные процедуры, которые передают аргументы напрямую в микросхему операций с плавающей запятой, а не в стек программы.

Дополнительные сведения о том, как включать или отключать встроенные функции в блоке исходного текста, а также примеры их использования см. в разделе #pragma function.

См. также

Ссылки

Директивы Pragma и ключевое слово __Pragma

Внутренний компилятора