Программирование >>  Расширенная версия языка c++ 

1 ... 19 20 21 [ 22 ] 23 24 25 ... 227


72 Самоучительc.,C++

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

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

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

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

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

Для объявления встраиваемой функции просто впишите спецификатор inline перед определением функции. Например, в этой короткой программе показано, как объявить встраиваемую функцию:

Пример встраиваемой функции ; i

ttinclude <iostreain> . . . :j .-j,

using namespace std;

inline int even (int x)

return ! {x%2) f

int main

if (even (10)) cout 10 является четным\п ;

теп(11)) cou 11 является четш=ол\п ; .

return 0; .

В этом примере функция которая возвращает истину при четном

аргументе, объявлена встраиваемой. Это означает, что строка

теп{10)) cou 10 является четным\п ; функционально идентична строке

if %2)) cou< 10 является четыым\п ;

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




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

1. Любая функция может стать встраиваемой, включая функции - члены классов. Например, функция divisible() для ускорения ее выполнения сделана встраиваемой. (Функция возвращает истину, если ее первый аргумент без остатка может делиться на второй.)

Демонстрация встраиваемой функции-члена

ttinclude <iostreaiti> .

using namespace std;

это не так, компилятор не будет знать, какой именно код предполагается

встроить в программу с помощью встраиваемой функции. Поэтому функция

even() бьла определена перед функцией main().

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

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

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

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

В зависимости от типа вашего компилятора возможны некоторые ограничения на использование встраиваемых функций. Например, некоторые компиляторы не воспринимают функцию как встраиваемую, если функция является рекурсивной или если она содержит либо статическую (static) переменную, либо любую инструкцию выполнения цикла, либо инструкцию switch, либо инструкцию goto. Вам необходимо просмотреть руководство по вашему компилятору, чтобы точно определить ограничения на использование встраиваемых функций.



samp: : samp (int a, int b)

i = a; , ,

j = b;

) > M

врат 1, если i без остатка ится . Тело этой функции-члена встраивается в программу

iniine int samp: :divi3ible() ,

return ! (i%j) ; . - - - i. т :. ,- ..

li . ,: i Lf u * --jftc . ;

int mainO .i: . .

samp obUlO, 2), ob2(10, 3);

это истина

if (obl.divisibleO ) cout iO делится на Z\n ;

это ложь

if (оЬ2. divisible О ) cout iO делится на 3\n ;

return 0;

2. Допускается перегружать встраиваемую функцию. Например, эта программа перегружает mui() тремя способами. В каждом случае функция также объявляется встраиваемой.

tfinclude <i03treain>

using namespace std; ; ~

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

int AMMi . ......

iniine int min (int a, int b) .-г -.ii: л.

{

return a < b ? a: b; : Ч *. :

long -,(Nr:.-

inline long min (long a, long b) :

class samp { и- . л : - .

int i , j ; л .. ..[,] j..

public: , : .... .... ... .-,

samp(int a, int b) ;

int divisible 0; встраивание происходит в этом определении



1 ... 19 20 21 [ 22 ] 23 24 25 ... 227

© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика