Программирование на C и C++

Онлайн справочник программиста на C и C++

INLINE-Функции

Хотя это и не относится в полной мере именно к объектно-ориентированному программирова­нию, одной из очень важных особенностей языка С++, которую нельзя найти в С, служит исполь­зование inline-функций. inline-функция — это такая функция, чье тело подставляется в каждую точ­ку вызова, вместо того, чтобы генерировать код вызова. Это подобно использованию параметризованных макросов в С. Имеются два способа создания inline-функции. Первый заключа­ется в использовании модификатора inline. Например, для создания inline-функции f, возвращаю­щей значение типа int и не имеющей параметров, достаточно объявить ее следующим образом:

inline int f()
{
// ...
}

Общая форма объявления inline-функции следующая:

inline объявление_функции

Модификатор inline предшествует всем частям объявления функции.

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

Однако в тех случаях, когда размер inline-функции достаточно большой, общий объем программы также возрастает. Поэтому в качестве inline-функции обычно используются очень маленькие функ­ции. Большие функции реализуются обычным способом. В качестве примера следующая программа использует ключевое слово inline для организации подстановки функций get_i() и put_i():

#include <iostream.h>
class cl {
int i;
public:
int get_i();
void put_i(int j);
};
inline int cl::get_i()
{
return i;
}
inline void cl::put_i(int j)
{
i = j;
}
int main()
{
cl s;
s.put i(10);
cout << s.get_i();
return 0;
}

Если откомпилировать эту версию программы и сравнить ее с программой, в которой ключе­вое слово inline не используется, то можно обнаружить, что версия с подстановкой на несколько байт меньше. Вызовы функций get_i() и put_i() также выполняются быстрее. Следует запомнить, однако, что если бы функции get_i() и put_i() были очень большими, то inline-версия программы была бы больше, чем версия без inline-функций. Но в любом случае она исполняется быстрее.

Важно ясно понимать, что технически inline представляет запрос к компилятору сгенерировать подставляемый код, inline не является командой. В некоторых ситуациях компилятор не будет выполнять этот запрос. Например, некоторые компиляторы не подставляют функции, содержа­щие циклы, switch и операторы goto. Borland С не подставляет функции, использующие исключе­ния или имеющие в качестве параметра объект, содержащий деструктор. Он также не подставляет функций, возвращающих объекты, имеющие деструкторы.