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