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

Как было указано выше, использование функций является экономичным с точки зрения использования памяти, поскольку вместо дублирования кода использует­ся механизм вызовов функций. Когда компилятор встречает вызов функции, он генерирует команду перехода в эту функцию. После выполнения функции осу­ществляется переход на оператор, следующий за вызовом функции.

Использование функций, наряду с сокращением размера памяти, занимаемой кодом, увеличивает время выполнения программы.

Для того чтобы сократить время выполнения небольших функций, вы може­те дать указание компилятору, чтобы при каждом вызове такой функции вместо команды перехода производилась подстановка операторов, выполняемых функ­цией, в код программы.

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

Встраиваемыми следует делать только очень короткие функции, содержа­щие один-два оператора.

Для того чтобы сделать функцию встраиваемой, необходимо лишь указать ключевое слово 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;

}