Встроенные объекты компилятора
Большинство функций содержатся в библиотеках, но некоторые функции, встроенные (то есть внутренние) в компилятор. Они называются встроенными или внутренними функциями .
Замечания
Если функция встроенная, код для этой обычно функции уже вставлен внутрь, что позволяет избежать вызова функции и позволяет максимально эффективно подготовить машинные инструкций для этой функции. Встроенная функция часто быстрее, чем эквивалентный встроенный ассемблер, потому что оптимизатор имеет собственные сведения о том, как ведут себя встроенные функции, поэтому могут быть доступны некоторые оптимизации, которые недоступны при использовании встроенный ассемблер. Кроме того, оптимизатор можно развернуть встроенную функцию по-разному, по-разному выровнять буферы или внести другие подстройки в зависимости от контекста и аргументов вызова.
Использование встроенных функций влияет на переносимость кода, поскольку встроенные функции, которые доступны в Visual C++, могут быть недоступны, если код компилируется с помощью других компиляторов, и некоторые встроенные функции, которые могут быть доступны для некоторых целевых архитектур, не доступны для всех архитектур. Однако встроенные функции обычно более переносимы по сравнению с встроенным ассемблером. Встроенные функции требуются для 64-разрядных архитектур, где встроенный ассемблер не поддерживается.
Некоторые встроенные функции, такие как __assume
и __ReadWriteBarrier
, передают компилятору информацию, которая влияет на поведение оптимизатора.
Некоторые встроенные функции доступны только как встроенные функции, а некоторые доступны как функции и их встроенные реализации. Можно указать компилятору использовать встроенные реализации одним из двух способов, в зависимости от того, хотите ли вы включить только определенные функции или нужно включить все встроенные функции. Первым способом является использование #pragma intrinsic(
встроенной функции-name-list)
. Директива pragma может использоваться для указания одной или нескольких встроенных функций, разделенных запятыми. Второй — использовать параметр компилятора /Oi (Создание встроенных функций), который делает все встроенные элементы на данной платформе доступными. В разделе /Oi используйте #pragma function(
встроенный список-function-name-list)
, чтобы принудительно использовать вызов функции вместо встроенного. Если документация для определенных встроенных заметок о том, что подпрограмма доступна только как встроенная, то встроенная реализация используется независимо от того, задано ли /Oi или #pragma intrinsic
задано. Во всех случаях /Oi или #pragma intrinsic
допускает, но не принудительно, оптимизатор использует встроенную. Оптимизатор может по-прежнему вызвать функцию.
Некоторые стандартные функции библиотеки C/C++, доступные как встроенные реализации для некоторых архитектур. При вызове функции CRT встроенная реализация используется при указании /Oi в командной строке.
Файл заголовка, <intrin.h>, доступен, который объявляет прототипы для общих встроенных функций. Встроенные компоненты производителя доступны в <файлах заголовка immintrin.h> и <ammintrin.h> . Кроме того некоторые заголовки Windows объявляют функции, которые ссылаются на встроенные функции компилятора.
В следующих разделах перечислены все встроенные функции, доступные для различных архитектур. Дополнительные сведения об использовании встроенных функций для конкретного целевого процессора можно найти в документации производителя.
См. также
Справочник по сборщику ARM
Справочник по сборщику макросов Майкрософт
Ключевые слова
Справочник по библиотеке времени выполнения C