Подставляемые (inline) функции
C++ имеет еще одну важную черту, которой нет в языке С. Это подставляемые функции (inline function). Подставляемые функции не вызываются как обычные функции языка C++. В машинный код программы вставляется код, соответствующий этой функции. Это как бы параметризированная макроподстановка, но уже на процессе компиляции.
Существует два способа создания inline-функций. В первом используется модификатор inline. Например,
inline int f(void)
{
…
}
т.е. перед объявлением функции ставится модификатор inline. Он предшествует всем другим модификаторам. Причина введения таких функций – повышение эффективности работы программы. Каждый раз, когда происходит вызов функции, выполняется несколько действий, включая пересылку параметров в стек и возврат значения функции. Требуется несколько тактов процессора (может быть достаточно много) для выполнения этих действий. Когда же используется inline-функция, на вызов такой функции время не тратится, соответственно, возрастает скорость выполнения программы. Но возрастает и размер кода программы, особенно если функция достаточно большая. Таким образом, лучше использовать inline-функцию тогда, когда функция очень маленькая. Большие по размеру функции рекомендуется вызывать обычным образом.
Рассмотрим пример:
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
class _class
{
int i;
public:
int get_i(void);
void put_i(int j);
};
inline int _class::get_i(void)
{
return i;
}
inline void _class::put_i(int j)
{
i=j;
}
void main (void)
{
_class s;
s.put_i(10);
cout << s.get_i();
}
Важно помнить, что для компилятора inline это требование, а не команда создания inline-кода. Есть различные ситуации, препятствующие созданию inline-кода. Это происходит тогда, когда функция:
- содержит циклы,
- операторы switch, goto
- или возвращает значение более одного раза.
Inline-функции не могут быть рекурсивными или содержать статические (static) переменные.
Функция, имеющая модификатор inline, может быть как функцией-членом какого-либо класса, так и обычной функцией.
Другой способ создания подставляемых функций в языке C++ состоит в описании функции внутри объявления шаблона класса. Любая функция, определенная внутри шаблона класса, автоматически делается inline-функцией. Поэтому нет необходимости предварять ее определение ключевым словом inline.
Например:
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
class _class
{
int i;
public:
int get_i(void)
{
return i;
}
void put_i(int j)
{
i=j;
}
};
void main (void)
{
_class s;
s.put_i(10);
cout << s.get_i();
}
Этот пример написан в стиле языка C++. В C++ короткие функции обычно определяются, как в этом примере, внутри класса.