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


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

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

Заметки

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

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

Некоторые встроенные функции, такие как __assume и __ReadWriteBarrier, передают компилятору информацию, которая влияет на поведение оптимизатора.

Некоторые встроенные функции доступны только как встроенные функции, а некоторые доступны как функции и их встроенные реализации. Можно указать компилятору использовать встроенные реализации одним из двух способов, в зависимости от того, хотите ли вы включить только определенные функции или нужно включить все встроенные функции. Первый способ заключается в использовании #pragma intrinsic(intrinsic-function-name-list). Директива pragma может использоваться для указания одной или нескольких встроенных функций, разделенных запятыми. Второй способ заключается в использовании параметра компилятора /Oi (Создание встроенных функций) , который делает доступными все встроенные функции, доступные для данной платформы. Под /Oi, используйте #pragma function(intrinsic-function-name-list) для принудительного вызова нужной функции вместо встроенной. Если документация для определенных встроенных функций указывает, что процедура доступна только как встроенная, то внутренняя реализация используется независимо от указано /Oi или #pragma intrinsic . Во всех случаях /Oi или #pragma intrinsic позволяет, но не заставляет, оптимизатор использовать встроенный вариант. Оптимизатор может по-прежнему вызвать функцию.

Некоторые стандартные функции библиотеки C/C++, доступные как встроенные реализации для некоторых архитектур. При вызове функции CRT, встроенная реализация используется, если в командной строке указан /Oi.

Файл заголовка, <intrin.h> позволяет объявлять прототипы для распространенных встроенных функций. Встроенные функции производителя доступны в файлах заголовков <immintrin.h> и <ammintrin.h> . Кроме того некоторые заголовки Windows объявляют функции, которые ссылаются на встроенные функции компилятора.

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

См. также

Ссылки

Ключевые слова в C++

Другие ресурсы

Справочник по ассемблеру ARM

Справочные материалы по ассемблеру Microsoft Macro Assembler

Справочник по библиотеке времени выполнения C