Лекция: Встраиваемые (inline) функции

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

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

Пример 5

int InFun (int n, int k) /*Символ ‘;’ в конце заголовка не пишется */

{ return! (n%k); }

int main() { int N=15; if ( InFun(N, 2))

cout<< N <<” — чётное”;

else cout<<N <<” – нечётное”;

getch(); return 0; }

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

int main() { int N=15; if (!(N% 2))

cout<< N <<” — чётное”;

else cout<<N <<” – нечётное”;

getch(); return 0; }

Текст функции копируется во все точки вызова с учётом фактических параметров, если функция вызывается несколько раз. Например, если в main встретится ещё раз, например, такой вызов r= InFun(N*N, 10); где r объявлена как int r; то фактически выполняться будет оператор r=!(N*N%10);

А что будет выведено с помощьюcout<<endl<<r; для того же значенияN=15? Так как N*N%10=15*15%10=5, а операция логического отрицания (“! ”) для любых ненулевых чисел даёт в результате , то это число, то есть 0 и будет выведено. Для N=10 будет выведена 1, так как 10*10%10=0, а !0=1.

Упражнение. Что будет выведено для N=4? N=1? N=0?

Такие функции выполняются быстрее, так как не надо тратить время на поиск кода функции, не надо передавать управление в функцию и обратно. Недостаток в том, что если встраиваемые функции часто вызываются и(или) они большие, то возрастает объём наших программ. Поэтому встраиваемыми функциями имеет смысл оформлять относительно небольшие функции. Некоторые компиляторы запрещают оформлять функцию как встраиваемую, если, например, она содержит вложенные циклы, оператор switch и другие конструкции, увеличивающие объём кода.

 

еще рефераты
Еще работы по информатике