65882

Вбудовані функції

Лекция

Информатика, кибернетика и программирование

Перед тим, як продовжити засвоєння механізмів роботи з класами, дамо невелике, але важливе пояснення. Воно не належить конкретно до об'єктно-орієнтованого програмування, але є дуже корисним засобом мови програмування C++, яке достатньо часто використовують у визначеннях класів.

Украинкский

2014-08-09

49.5 KB

1 чел.

Лекція № 3

Тема: Вбудовані функції

План:

  1.  Inline функції
  2.  Використання вбудованих функцій у визначенні класу.

 

  1.  Inline функції

     Перед тим, як продовжити засвоєння механізмів роботи з класами, дамо невелике, але важливе пояснення. Воно не належить конкретно до об'єктно-орієнтованого програмування, але є дуже корисним засобом мови програмування C++, яке достатньо часто використовують у визначеннях класів. Йдеться про вбудовану функцію (inline function), або підставну функцію. Вбудованою називається функція, програмний код якої підставляється в те місце рядка програми, з якого вона викликається, тобто виклик такої функції замінюється її кодом.    Існує два способи створення вбудованої функції. Перший полягає у використанні модифікатора inline.

     Наприклад, щоби створити вбудовану функцію Fun(), яка повертає int-значення і не приймає жодного параметра, достатньо оголосити її так:

          inline int Fun()

          {

                         //...

           }

     Модифікатор inline повинен передувати усім решта настанов оголошення самої функції.

Причиною існування вбудованих функцій є ефективність їх використання. Адже під час кожного виклику звичайної функції виконається деяка послідовність настанов, пов'язаних з обробленням самого виклику, що містить занесення її аргументів у стек, чи поверненням їх з функції. В деяких випадках значна кількість циклів центрального процесора використовується саме для виконання цих дій. Але, якщо функція вбудовується в рядок програми, то таких системних витрат просто немає, і загальна швидкість виконання програми зростає. Якщо ж вбудована функція виявляється великою, то загальний розмір програми може істотно збільшитися. Тому краще, як вбудовані використовувати тільки маленькі функції, а ті, що є більшими, оформляти у вигляді звичайних функцій.

     Продемонструємо механізм використання вбудованої функції на прикладі такої програми.

Код програми. Демонстрація механізму використання вбудованої функції

#include <vcl>

#include <iostream>     // Для потокового введення-виведення

#include <conio>           // Для консольного режиму роботи

using namespace std;    // Використання стандартного простору імен

class myClass           // Оголошення класового типу

       {           

                     int c;

          public:

                     int Put();

                     void Get(int d);

       };

inline int myClass::Put()

 {  

       return c;

 }

inline void myClass::Get(int d)

 {      

       c = d;

 }

int main()

{

      myClass Obj;          // Створення об'єкта класу

      Obj.Get(10);

      cout << "c= " << Obj.Put() << endl;

      getch(); return 0;

}

      У цьому коді програми замість виклику функцій Put() і Get() підставляють їх код. Так, у функції main() рядок

                                         Obj.Get(10);

функціонально еквівалентний такій настанові присвоєння:

                                         Obj.c = 10;

      Оскільки змінна c за замовчуванням закрита у межах класу myClass, то цей рядок не може реально існувати в коді функції main(), але за рахунок вбудованої функції Get() досягнуто того ж результату, одночасно позбавившись витрат системних ресурсів, взаємопов'язаних з викликом функції.

      Важливо розуміти, що насправді використання модифікатора inline є запитом, а не командою, за якою компілятор згенерує вбудований (inline) код. Існують різні ситуації, які можуть не дати змоги компіляторові задовольнити наш запит. Ось декілька прикладів:

  •  деякі компілятори не генерують вбудованого коду, якщо відповідна функція містить цикл,             конструкцію switch або настанову goto;
  •  найчастіше вбудованими не можуть бути рекурсивні функції;
  •  як правило, механізм вбудовування "не проходить" для функцій, які містять статичні (static) змінні.

  1.  Використання вбудованих функцій у визначенні класу.

      Існує ще один механізм реалізації вбудованої функції. Він полягає у визначенні коду програми для функції-члена класу в самому оголошенні класу. Будь-яка функція, що визна-чається в оголошенні класу, автоматично стає вбудованою. У цьому випадку непотрібно передувати її оголошенню ключовим словом inline.

      Наприклад, наведену вище програму можна переписати у такому вигляді.

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

using namespace std;              // Використання стандартного простору імен

class myClass

{

                   int c; // Закритий член за замовчуванням

      public:

                  // Автоматично вбудовані функції

                  int Put() { return c; }

                  void Get(int d) { c = d; }

};

int main()

{

       myClass Obj;        // Створення об'єкта класу

       Obj.Get(10);

       cout << "c= " << Obj.Put() << endl;

       getch(); return 0;

}

      У цьому коді програми функції Put() і Get() визначені всередині оголошення класу myClass, тобто вони автоматично є вбудованими.

      Зверніть увагу на те, як виглядають коди функцій, визначених усередині класу myClass. Для невеликих за обсягом функцій таке представлення коду програми відображає звичайний стиль форматування програм мовою C++. Проте ці функції можна відформатувати ще й так:

           // Альтернативний запис вбудованих функцій у визначенні класу

class myClass

{

                  int c;

      public:

                  // Вбудовані функції

                  int Put()

                           { 

                                   return c;

                           }

                  void Get(int d)

                           {

                                   c = d;

                            }

};

     У загальному випадку невеликі функції (які подано у наведеному вище прик-

ладі) визначаються в оголошенні класу.


 

А также другие работы, которые могут Вас заинтересовать

15642. КРИТИКА В КОНТЕКСТЕ ЭСТЕТИКИ (О ДЕЯТЕЛЬНОСТИ И ТВОРЧЕСТВЕ А. ЛЕЖНЕВА) 226.5 KB
  КРИТИКА В КОНТЕКСТЕ ЭСТЕТИКИ О ДЕЯТЕЛЬНОСТИ И ТВОРЧЕСТВЕ А. ЛЕЖНЕВА В начале 20х годов когда жизнь многих людей меняла свой ход никого не могло удивить появление из безвестности нового литературного имени – А. Лежнева. Никто не знал что Абрам Захарович Горелик А. Л...
15643. Энвайронементализм (экологическое направление) 185 KB
  Лекция 22. Энвайронементализм экологическое направление 1. Географический подход в археологии. Этногеография дала импульс не только диффузионизму в археологии но и упору на географический фактор хотя географический детерминизм имеет и более
15644. Инвазионизм и библейская археология 220.5 KB
  Лекция 23. Инвазионизм и библейская археология 1. Миграционизм как инвазионизм. Миграция вообще предстает в исходном пункте как эмиграция в конечном – как иммиграция а если в новую страну передвинулся целый народ или армия то такая иммиграция описывается как вторж...
15645. Комбинационизм в археологии 279.5 KB
  Лекция 26. Комбинационизм. Незамеченное течение. В трансмиссионизме постепенно всё большее место занимала констатация не самих заимствований а их воздействия на остальную культуру на местные ее элементы причем в воспринимающих очагах под воздейст...
15646. Эмпирические школы в археологии 480.5 KB
  24 Лекция 31. Эмпирические школы. 1. Введение. В археологической литературе иногда встречаются указания на эмпирическую школу но всякий раз оказывается что под этим названием фигурируют разные группы ученых разного времени и в разных странах. То ест
15647. Автономная археология в историческом синтезе и эмергентизм 424 KB
  Лекция 33. Автономная археология в историческом синтезе и эмергентизм 1. На руинах археологии обитания. В 1947 г. на конференции в Гамбурге собравшимся немецким археологам было сказано: Сегодня наша преистория прежде всего стоит перед задачей привести в порядок сп
15648. Реболлинг (восстановление шариковых выводов) BGA компонентов (чипов) 446.5 KB
  Реболлинг восстановление шариковых выводов BGA компонентов чипов Рис.1 Примеры выполненных трафаретов для восстановления шариков BGA Рис.2 Восстановленные шариковые выводы BGA чипа Необходимое оборудование Сушка рекомендуется для подсушки ком
15649. ДОМАШНИЙ АРЕСТ КАК МЕРА ПРЕСЕЧЕНИЯ В УГОЛОВНОМ ПРОЦЕССЕ 36.95 KB
  ДОМАШНИЙ АРЕСТ КАК МЕРА ПРЕСЕЧЕНИЯ В УГОЛОВНОМ ПРОЦЕССЕ А. АЛЕКСАНДРОВ Александров Александр профессор Нижегородской академии МВД России доктор юридических наук профессор. Федеральный закон от 7 декабря 2011 г. N 420ФЗ содержит новую редакцию ст. 107 УПК РФ рег
15650. УГОЛОВНО-ПРОЦЕССУАЛЬНЫЕ ГАРАНТИИ ОБЕСПЕЧЕНИЯ РЕАЛИЗАЦИИ ПРАВ НЕСОВЕРШЕННОЛЕТНИХ ПОТЕРПЕВШИХ 23.94 KB
  УГОЛОВНОПРОЦЕССУАЛЬНЫЕ ГАРАНТИИ ОБЕСПЕЧЕНИЯ РЕАЛИЗАЦИИ ПРАВ НЕСОВЕРШЕННОЛЕТНИХ ПОТЕРПЕВШИХ М.Ю. АРЧАКОВ В статье автором рассмотрены теоретические вопросы касающиеся проблем совершенствования уголовнопроцессуального порядка реализации в отечественном у...