Встраиваемые функции в С++

В C++ можно задать функцию, которая на самом деле не вызывается, а ее тело встраивается в программу в месте ее вызова. Преимуществом встраиваемых (in-line) функций является то, что они не связаны с механизмом вызова функций и возврата ими своего значения. Это значит, что встраиваемые функции могут выполняться гораздо быстрее обычных.

b<>Замечание. Выполнение машинных команд, которые генерируют вызов функции и воз-вращение функцией своего значения, занимает определенное время. Если функция имеет параметры, то ее вызов занимает еще большее время.

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

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

Пример.
// Пример встраиваемой функции
#include 
using namespace std;

inline int even (int x)
{
return ! (x%2);
int main ()
{
if (even (10)) cout ≪ "10 является четным\п";
if (even (11)) cout ≪ "11 является четным\п";
return 0;
}
В примере функция even(), которая возвращает истину при четном аргументе, объявлена встраиваемой. Это означает, что строка
if (even(10)) cout ≪ "10 является четным\n";
функционально идентична строке
if (! (10%2)) cout ≪ "10 является четным\n";
Важно. Особенность использования встраиваемой функции: она должна быть задана до ее первого вызова. Если это не так, компилятор не будет знать, какой именно код предполагается встроить в программу с помощью встраиваемой функции. Поэтому функция even() была определена перед функцией main().

Пример. Любая функция может стать встраиваемой, включая функции — члены классов. Например, функция divisible!) для ускорения ее выполнения сделана встраиваемой. (Функция возвращает истину, если ее первый аргумент без остатка может делиться на второй.)
// Демонстрация встраиваемой функции-члена
#include 
using namespace std;

class samp {
 int i, j;
public:
 samp(int a, int b);
 int divisible(); // встраивание происходит в этом определении
};

samp::samp(int a, int b)
{
 i = a;
 j = b;
}

/* Возврат 1, если i без остатка делится на j. Тело этой функции-члена 
встраивается в программу
*/
inline int samp::divisible()
{
 return !(i%j);
}

int main()
{
 samp ob1(10, 2), ob2(10, 3);

 // это истина
 if(ob1.divisible()) cout << "10 делится на 2\n";

 // это ложь
 if(ob2.divisible()) cout << "10 делится на 3\n";

 return 0;
}
Пример. Допускается перегружать встраиваемую функцию. Программа перегружает min() тремя способами. В каждом случае функция также объявляется встраиваемой.
#include 
using namespace std;

// Перегрузка функции min() тремя способами

// int
inline int min(int a, int b)
{
 return a < b ? a : b;
}

// long
inline long min(long a, long b)
{
 return a < b ? a : b;
}

// double
inline double min(double a, double b)
{
 return a < b ? a : b;
}

int main()
{
 cout << min(-10, 10) << "\n";
 cout << min(-10.01, 100.002) << "\n";
 cout << min(-10L, 12L) << "\n";

 return 0;
}
Онлайн всего: 4
Гостей: 4
Пользователей: 0

STUDLAB Сообщить про опечатку на сайте