Прототипы функций

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

Использование функций снижает быстродействие программы. Это объясняется затратами времени на вызов функций (работа со стеком программы). Если в программе используется большое количество вызовов небольших функций, то быстродействие программы может существенно снизиться.

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

inline int ReadInt(char *S) // Ввод целых значений по текстовому запросу S

{

cout << S;

int I;

cin >> I;

return I;

}

{

……..

int Vozrast = ReadInt (“Сколько Вам лет? ”);

……..

int Kurs = ReadInt (“На каком курсе Вы учитесь? ”);

……..

int Ocenka = ReadInt (“Сколько у Вас отличных оценок в последней сессии? ”);

……..

}

При определении inline- функции компилятор заменяет (если это можно сделать) каждый вызов этой функции кодом функции. При такой подстановке код программы увеличивается, но зато экономится время на вызов встроенной функции.

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

Некоторые компиляторы накладывают определенные ограничения на содержание встраиваемых функций. К таким ограничениям обычно относятся использование внутри встраиваемых функций:

· рекурсии;

· циклов, переключателей, инструкций goto;

· статических (static) переменных.

В любом случае компилятор сам определит можно ли встраивать функцию или необходимо вызвать ее обычным способом.

Прототипом функции называется заголовок функции (со списком параметров), заканчивающийся символом;. Например:

double F (int P1, double P2); // Это прототип функции F

double F (int P1, double P2) // А это сама функция F

{

return P1 * P2;

}

В прототипе функции допускается не указывать имена параметров (типы параметров должны быть указаны обязательно). Например, прототип той же функции можно записать так:

double F (int, double); // И это прототип функции F

Назначение прототипов – это опережающее описание функции, определяющее правила вызова функции.

Обычно прототипы функций используются в заголовочных файлах.

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

void A ()

{

……

B ();

……

}

void B ()

{

……

A ();

……

}

Это пример, так называемого, “перекрестного” вызова функций (функция А вызывает функцию В, а функция В вызывает функцию А). В этом случае конфликт может быть разрешен с помощью использования прототипа функции B:

void B ();

void A ()

{

……

B ();

……

}

void B ()

{

……

A ();

……

}

Теперь функция А “знает”, что представляет собой функция В и как ее вызвать.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: