C++ поддерживает функции специального назначения. Они включают встроенные функции, void-функции и рекурсивные функции. Встроенные (inline) функции помогают ускорять программу. Void-функции в C++ аналогичны процедурам на других языках программирования. Рекурсивные функции – специальные виды функций, которые вызывают себя сами, пока наконец не получат окончательного результата.
Встроенные функции (inline-функции)
Использование inline-функций может ускорить выполнение программы.
Обработка вызова обычной функции на этапе выполнения программы происходит следующим образом:
– приостанавливается выполнение вызывающей функции и запоминается адрес возврата;
– в стеке выделяется место под параметры вызываемой функции, значения аргументов передаются параметрам, и функция выполняет свою работу;
– если функция является типизированной, то создается временная переменная для хранения возвращаемого значения;
– когда значение возвращено, эта временная переменная уничтожается.
|
|
Все это требует времени на выполнение. Ускорение выполнения программы за счет использования inline-функций происходит потому, что на этапе компиляции вызов функции заменяется копией ее тела, а параметры заменяются аргументами, поэтому на этапе выполнения функция на самом деле не вызывается. Однако в тех случаях, когда размер inline-функции достаточно большой и ее вызовы встречаются слишком часто, общий объем программы может сильно увеличиться. Поэтому в качестве inline-функций используются очень маленькие функции, а большие реализуются обычным способом.
Для создания inline-функций используется модификатор inline, который предшествует объявлению функции. Например, создадим встроенную функцию для вычисления квадрата числа:
inline int Sqr(int X)
{ return X * X; }
//---------------------------------------void main()
{
int X = 5;
int Y = Sqr(X); // подстановка Y = X * X;
printf("\n\n Квадрат %lf равен %lf", X, Y);
}
Ключевое слово inline не является командой, оно представляет лишь запрос к компилятору сгенерировать подставляемый код, который не обязательно будет удовлетворен. Например, inline-функции не могут быть рекурсивными или содержать статические локальные переменные. Некоторые компиляторы не подставляют функции, содержащие циклы, операторы switch и goto. Если какое-либо из ограничений нарушено, то компилятор генерирует обычную функцию.