Встраиваемые функции.
Как было указано выше, использование функций является экономичным с точки зрения использования памяти, поскольку вместо дублирования кода используется механизм вызовов функций. Когда компилятор встречает вызов функции, он генерирует команду перехода в эту функцию. После выполнения функции осуществляется переход на оператор, следующий за вызовом функции.
Использование функций, наряду с сокращением размера памяти, занимаемой кодом, увеличивает время выполнения программы.
Для того чтобы сократить время выполнения небольших функций, вы можете дать указание компилятору, чтобы при каждом вызове такой функции вместо команды перехода производилась подстановка операторов, выполняемых функцией, в код программы.
Такое решение описывает встраиваемые функции. Встраиваемые функции пишутся так же, как и обычные, но при компиляции их исполняемый код вставляется, или встраивается, в исполняемый код программы. Листинг программы сохраняет свою организованность и четкость, поскольку функция остается независимой частью программы. В то же время компиляция обеспечивает эффект встраивания кода функции в код программы.
Встраиваемыми следует делать только очень короткие функции, содержащие один-два оператора.
Для того чтобы сделать функцию встраиваемой, необходимо лишь указать ключевое слово inline в прототипе функции:
inline function();
Следует отметить, что ключевое слово inline является лишь рекомендацией компилятору, которая может быть проигнорирована. В таком случае функция будет скомпилирована как обычная. Такое может произойти, например, в том случае, если компилятор посчитает функцию слишком длинной для того, чтобы делать ее встраиваемой.
Рассмотрим следующий пример со встраиваемой функцией:
Пример 6:
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
using namespace std;
class MArray
{
protected:
int size;
int A[50];
public:
inlineint takeA(int n)// Функция возврата A[n] элемента массива
{
return A[n];
};
inline int takeA(int n,int m)//Функция возврата A[n+m] элемента массива
{
return A[n+m];
};
};
class nasl:public MArray
{
public:
void Keyboard()
{
int i;
cout<<"Vvedite razmer massiva";
cin>>size;
for(i=0;i<size;i++)
{
cin>>A[i];
}
};
void DisplayA()// функция вывода массива на экран
{
int i;
for(i=0;i<size;i++)
{
cout<<" "<<A[i];
}
};
};
int main()
{
int i,k,m;
nasl a;
a.Keyboard();
a.DisplayA();
cout<<"Vvedite nomer elementa\n";
cin>>k;
i=a.takeA(k);
cout<<"A["<<k<<"]="<<" "<<i;
cout<<"Vvedite m & k\n";
cin>>k>>m;
i=a.takeA(k,m);
cout<<"A["<<k+m<<"]="<<" "<<i;
return 0;
}