Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С и С++.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
212.63 Кб
Скачать

28.Функции-подстановки (inline).

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

Общая форма объявления inline-функции следующая:

inline объявление_функции

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

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

Важно ясно понимать, что технически inline представляет запрос к компилятору сгенерировать подставляемый код, inline не является командой. В некоторых ситуациях компилятор не будет выполнять этот запрос. Например, некоторые компиляторы не подставляют функции, содержащие циклы, switch и операторы goto. Borland С не подставляет функции, использующие исключения или имеющие в качестве параметра объект, содержащий деструктор. Он также не подставляет функций, возвращающих объекты, имеющие деструкторы.

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

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

#include <iostream>

using namespace std;

inline int even(int x)

{

return ! (x%2) ;

}

int main()

{

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

if (even(11) ) cout « "11 является четным\n";

return 0;

}

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

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

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

функционально идентична строке

if ( ! (10%2) ) cout « "10 является четным\n";

Этот пример указывает также на другую важную особенность использования встраиваемой функции: она должна быть задана до ее первого вызова. Если это не так, компилятор не будет знать, какой именно код предполагается встроить в программу с помощью встраиваемой функции. Поэтому функция even() была определена перед функцией main().

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