7.6. Встроенные функции

7.6. Встроенные функции

Рассмотрим следующую функцию min():

int min( int vl, int v2 )

{

return( vl v2 ? vl : v2 );

}

Преимущества определения функции для такой небольшой операции таковы:

* как правило, проще прочесть и интерпретировать вызов min(), чем читать условный оператор и вникать в смысл его действий, особенно если v1 и v2 являются сложными выражениями;

модифицировать одну локализованную реализацию в приложении легче, чем 300. Например, если будет решено изменить проверку на:

( vl == v2 || vl v2 )

* поиск каждого ее вхождения будет утомительным и с большой долей вероятности приведет к ошибкам;

* семантика единообразна. Все проверки выполняются одинаково;

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

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

int minVa12 = min( i, j );

заменяется при компиляции на

int minVal2 = i j ? i : j;

Таким образом, не требуется тратить время на реализацию min() в виде функции.

Функция min() объявляется как встроенная с помощью ключевого слова inline перед типом возвращаемого значения в объявлении или определении:

inline int min( int vl, int v2 ) { /* ... */ }

Заметим, однако, что спецификация inline – это только подсказка компилятору. Компилятор может проигнорировать ее, если функция плохо подходит для встраивания по месту. Например, рекурсивная функция (такая, как rgcd()) не может быть полностью встроена в месте вызова (хотя для самого первого вызова это возможно). Функция из 1200 строк также скорее всего не подойдет. В общем случае такой механизм предназначен для оптимизации небольших, простых, часто используемых функций. Он крайне важен для поддержки концепции сокрытия информации при разработке абстрактных типов данных. Например, встроенной объявлена функция-член size() в классе IntArray из раздела 2.3.

Встроенная функция должна быть видна компилятору в месте вызова. В отличие от обычной, такая функция определяется в каждом исходном файле, где есть обращения к ней. Конечно же, определения одной и той же встроенной функции в разных файлах должны совпадать. Если программа содержит два исходных файла compute.C и draw.C, не нужно писать для них разные реализации функции min(). Если определения функции различаются, программа становится нестабильной: неизвестно, какое из них будет выбрано для каждого вызова, если компилятор не стал встраивать эту функцию.

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

Поскольку min() является общеупотребительной операцией, реализация ее входит в стандартную библиотеку С++; это один из обобщенных алгоритмов, описанных в главе 12 и в Приложении. Функция min() реализована как шаблон, что позволяет ей работать с операндами арифметического типа, отличного от int. (Шаблоны функций рассматриваются в главе 10.)

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

CSS и встроенные изображения

Из книги Разгони свой сайт автора Мациевский Николай

CSS и встроенные изображения Такие изображения, внедренные в HTML-страницы, не кэшируются для повторного использования. И они не кэшируются от страницы к странице (это логично: ведь нам нужно каждый раз загружать HTML-код для отображения этой картинки, они будут кэшироваться


Встроенные кухни

Из книги Домашний архитектор. Подготовка к ремонту и строительству на компьютере автора Булат Виталий

Встроенные кухни Для моделирования встроенных кухонь и отдельных их составляющих может использоваться программа «3D Suite Мебельный салон». При сравнительно небольшом объеме продукт (далее будет рассмотрена версия v2.6) обладает разнообразным функционалом.После запуска


Встроенные типы данных

Из книги Delphi. Учимся на примерах автора Парижский Сергей Михайлович

Встроенные типы данных Числовые типы К числовым типам языка Object Pascal относятся целочисленные и типы чисел с плавающей запятой (табл. Д.1).Таблица Д.1. Числовые типы данных языка Object Pascal Целочисленные типы Диапазон значений Типы чисел с плавающей запятой Диапазон


1.3.2. Встроенные классы

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

1.3.2. Встроенные классы Свыше 30 классов уже встроено в Ruby. Как и во многих других объектно-ориентированных языках, в нем не допускается множественное наследование, но это еще не означает, что язык стал менее выразительным. Современные языки часто построены согласно модели


Встроенные шаблоны

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

Встроенные шаблоны Для того чтобы обеспечить рекурсивную обработку документа при преобразовании, в XSLT существуют так называемые встроенные шаблоны. Несмотря на то, что они не описываются в преобразованиях явным образом, встроенные шаблоны применяются процессорами по


5.2.2. Встроенные функции

Из книги Linux: Полное руководство автора Колисниченко Денис Николаевич

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


3.4.1. Встроенные команды

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

3.4.1. Встроенные команды Список встроенных команд оболочки bash можно получить по команде help или найти на man-странице в секции SHELL BUILTIN COMMANDS. Напоминаю, что поиск в выводе команды man выполняется командой /<образец><Ввод>, а поиск следующего вхождения образца — по нажатии


Пример 17-8. Встроенные документы и функции

Из книги Операционная система UNIX автора Робачевский Андрей М.

Пример 17-8. Встроенные документы и функции #!/bin/bash# here-function.shGetPersonalData (){ read firstname read lastname read address read city read state read zipcode} # Это немного напоминает интерактивную функцию, но...# Передать ввод в функцию.GetPersonalData <<RECORD001BozoBozeman2726 Nondescript Dr.BaltimoreMD21226RECORD001echoecho "$firstname $lastname"echo "$address"echo "$city,


Встроенные переменные

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

Встроенные переменные Помимо переменных, определяемых явно, shell имеет ряд внутренних переменных, значения которых устанавливаются самим интерпретатором. Поскольку это внутренние переменные, имя переменной вне контекста получения ее значения не имеет смысла (т.е. не


13.3.1. Когда использовать встроенные функции-члены

Из книги автора

13.3.1. Когда использовать встроенные функции-члены Обратите внимание, что определения функций home(), get(), height() и width() приведены прямо в теле класса. Такие функции называются встроенными. (Мы говорили об этом в разделе 7.6.)Функции-члены можно объявить в теле класса встроенными и