Встроенные объекты компилятора

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

Комментарии

Если функция встроенная, код для этой обычно функции уже вставлен внутрь, что позволяет избежать вызова функции и позволяет максимально эффективно подготовить машинные инструкций для этой функции. Встроенная функция часто быстрее, чем эквивалентный встроенный ассемблер, потому что оптимизатор имеет собственные сведения о том, как ведут себя встроенные функции, поэтому могут быть доступны некоторые оптимизации, которые недоступны при использовании встроенный ассемблер. Кроме того, оптимизатор можно развернуть встроенную функцию по-разному, по-разному выровнять буферы или внести другие подстройки в зависимости от контекста и аргументов вызова.

Использование встроенных функций влияет на переносимость кода, поскольку встроенные функции, которые доступны в 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