С++ для начинающих




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


Рассмотрим следующую функцию 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.




      Содержание  Назад  Вперед