258 Часть II. Программирование на С++
Ключевое слово inline является для компилятора своеобразной подсказкой. Компилятор имеет полное право проигнорировать ее и оформить такую функцию не как встраиваемую, а как самую обычную.
При вызове обычной функции происходят следующие операции: аргументы записываются в стек, вызывается функция, функция извлекает аргументы из стека, функция выполняет код и, наконец, функция возвращает управление. Использование спецификатора inline изменяет эту последовательность. Но, если встраиваемая функция слишком велика, может стать неоправданно большой сама программа, поскольку вызов функции везде замещается ее кодом; Лучше всего делать встраиваемыми небольшие функции.
Возьмем пример макроса Swap из главы 4 "Препроцессор". Применив алгоритм Swap к целым числам, получим встраиваемую функцию:
// используем операцию & для того, чтобы реально
// обменять а и b значениями
void Swap ( int &a, int &b)
{ int t = а; а = b; b =• t;-}
Встраиваемые функции следует применять для решения задач примерно такого объема и сложности. В табл. 11.1 представлено сравнение макросов С, обычных и встраиваемых функций.
Предмет сравнения Свойства
Макрос, встраиваемая функция Макрос, встраиваемая функция Встраиваемая функция, обычная функция Макрос, встраиваемая функция
Встраиваемая функция, обычная функция Встраиваемая функция, обычная функция
Имя замещается кодом Отсутствует вызов функции Типы аргументов проверяются
Тело функции или макроса может появляться многократно
Могут быть перегружены Могут иметь аргументы по умолчанию
Табл. 11.1 сравнивает макросы, обычные и встраиваемые функции. Обратите внимание, что все, относящееся к макросам, справедливо и для встраиваемых функций: эти функции задумывались как замена макросам И.
Используйте встраиваемые функции там, где вы собирались вводить макроопределения, а в остальных случаях удовлетворитесь обычными функциями. Далее речь пойдет о других ключевых словах, имеющих отношение к созданию функций.