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


встроенный, __inline, __forceinline

inline и __inline описатели указывают компилятора вставить копию тела функции в каждое размещение вызове функции.

inline function_declarator;   
__inline function_declarator;   // Microsoft Specific
__forceinline function_declarator;   // Microsoft Specific

Заметки

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

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

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

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

Встроенная ключевое слово доступен только в C++.__inline и __forceinline ключевые слова доступны как в c# и C++.Для обеспечения совместимости с предыдущими версиями _inline синоним __inline.

Встроенная ключевое слово сообщает компилятору, что встроенное расширение, предпочитаемое.Однако компилятор может создать отдельный экземпляр функции (" ошибка при создании экземпляра) и создать стандарт вызывающий переключение вместо ввода встроенного кода.2 Случаи, когда это может происходить:

  • Рекурсивные функции.

  • Функции, которые ссылаются на через указатель в любом месте единицы измерения.

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

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

/Ob параметр оптимизации компилятора помогает определить, происходит ли расширение встроенных функций виртуальной.

/LTCG выполняет встраивание крест-модуль независимо от того, было ли это запрошено в исходном коде.

Пример 1

// inline_keyword1.cpp
// compile with: /c
inline int max( int a , int b ) {
   if( a > b ) 
      return a;
   return b;
}

Функции-члены типа могут быть объявлены встроенным то с помощью Встроенная ключевое слово или установив определение функции в определении класса.

Пример 2

// inline_keyword2.cpp
// compile with: /EHsc /c
#include <iostream>
using namespace std;

class MyClass {
public:
   void print() { cout << i << ' '; }   // Implicitly inline
private:
   int i;
};

Только для систем Microsoft

__inline ключевое слово соответствует Встроенная.

Даже с __forceinlineкомпилятор не может встроенный код во всех случаях.Компилятор не может встроено функция, если:

  • Функция или вызывающий объект компилировать с параметром /Ob0 (параметр по умолчанию для отладки построения).

  • Функция и вызывающий объект используют различные типы обработки исключений (обработки исключений C++ в одном, структурной обработки исключений в другом).

  • Функция принимает переменное число аргументов.

  • Функция не будет использовать встроенную сборку, если компилироваться с /Og, /Ox, /O1 или /O2.

  • Функция рекурсивная и не сопровождаться by inline_recursion #pragma (вкл.).С помощью прагма-директивы, рекурсивные функции встроенным в глубину вызовов по умолчанию 16.Для уменьшения встраивание глубины, используйте inline_depth директива pragma.

  • Функция фактически и называется виртуальным.Прямых вызовов к виртуальным может быть встроенным функциям.

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

  • Функция также отмечена наг __declspec модификатор.

Если компилятор не может функция, объявленная с встроено __forceinlineон создает предупреждение уровня 1.

Рекурсивные функции могут быть замещенным встроенным на заданной глубине inline_depth директива pragma - не более 16 вызовов.После эта глубина, рекурсивные вызовы функций обрабатывается как вызовы к экземпляру функции.Глубина, к которой рекурсивные функции проверяются встроенный эвристикой не может превышать 16.inline_recursion директива pragma контролирует встроенное расширение функции в настоящий момент с расширением.См. расширение Встроенный-Функции параметр компилятора /Ob дополнительные сведения.

ЭЛЕМЕНТ, относящийся Майкрософт

Дополнительные сведения об использовании Встроенная описатель см. в разделах:

См. также

Ссылки

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

noinline

auto_inline