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;

                            }

};

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

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


 

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

81481. Строение и биологические функции эйкозаноидов. Биосинтез простагландинов и лейкотриенов 107.74 KB
  Биосинтез простагландинов и лейкотриенов. Структура номенклатура и биосинтез простагландинов и тромбоксанов Хотя субстраты для синтеза эйкозаноидов имеют довольно простую структуру полистовые жирные кислоты из них образуется большая и разнообразная группа веществ. Структура и номенклатура простагландинов и тромбоксанов Простагландины обозначают символами например PG А где PG обозначает слово простагландин а буква А обозначает заместитель в пятичленном кольце в молекуле эйкозаноида. Каждая из указанных групп простагландинов состоит из 3...
81482. Холестерин как предшественник ряда других стероидов. Представление о биосинтезе холестерина. Написать ход реакций до образования мевалоновой кислоты. Роль гидроксиметилглутарил-КоА-редуктазы 165.9 KB
  В печени синтезируется более 50 холестерола в тонком кишечнике 15 20 остальной холестерол синтезируется в коже коре надпочечников половых железах. В сутки в организме синтезируется около 1 г холестерола; с пищей поступает 300500 мг Холестерол выполняет много функций: входит в состав всех мембран клеток и влияет на их свойства служит исходным субстратом в синтезе жёлчных кислот и стероидных гормонов. Предшественники в метаболическом пути синтеза холестерола превращаются также в убихинон компонент дыхательной цепи и долихол...
81483. Синтез желчных кислот из холестерина. Конъюгация желчных кислот, первичные и вторичные желчные кислоты. Выведение желчных кислот и холестерина из организма 104.99 KB
  Конъюгация желчных кислот первичные и вторичные желчные кислоты. Выведение желчных кислот и холестерина из организма. Жёлчные кислоты синтезируются в печени из холестерола.
81484. ЛПНП и ЛПВП - транспортные, формы холестерина в крови, роль в обмене холестерина. Гиперхолестеринемия. Биохимические основы развития атеросклероза 110.43 KB
  Содержание холестерола и его эфиров в ЛППП достигает 45; часть этих липопротеинов захватывается клетками печени через рецепторы ЛПНП которые взаимодействуют и с апоЕ и с апоВ100. Транспорт холестерола в составе ЛПНП. Рецепторы ЛПНП. На ЛППП оставшиеся в крови продолжает действовать ЛПлипаза и они превращаются в ЛПНП содержащие до 55 холестерола и его эфиров.
81485. Механизм возникновения желчнокаменной болезни (холестериновые камни). Применение хенодезокеихолевой кислоты для лечения желчнокаменной болезни 103 KB
  Выделение холестерола в жёлчь должно сопровождаться пропорциональным выделением жёлчных кислот и фосфолипидов удерживающих гидрофобные молекулы холестерола в жёлчи в мицеллярном состоянии У большинства больных желчнокаменной болезнью активность ГМГКоАредуктазы повышена следовательно увеличен синтез холестерола а активность 7αгидроксилазы участвующей в синтезе жёлчных кислот снижена. В результате синтез холестерола увеличен а синтез жёлчных кислот из него замедлен что приводит к диспропорции количества холестерола и жёлчных кислот...
81486. Общая схема источников и путей расходования аминокислот в тканях. Динамическое состояние белков в организме 134.22 KB
  Значение аминокислот для организма в первую очередь определяется тем что они используются для синтеза белков метаболизм которых занимает особое место в процессах обмена веществ между организмом и внешней средой. Аминокислоты непосредственно участвуют в биосинтезе не только белков но и большого количества других биологически активных соединений регулирующих процессы обмена веществ в организме таких как нейромедиаторы и гормоны производные аминокислот. Аминокислоты служат донорами азота при синтезе всех азотсодержащих небелковых...
81487. Переваривание белков. Протеиназы - пепсин, трипсин, химотрипсин; проферменты протеиназ и механизмы их превращения в ферменты. Субстратная специфичность протеиназ. Экзопептидазы и эндопептидазы 110.2 KB
  Подавляющее их количество входит в состав белков которые гидролизуются в ЖКТ под действием ферментов протеаз пептидщцролаз. Под действием всех протеаз ЖКТ белки пищи распадаются на отдельные аминокислоты которые затем поступают в клетки тканей. Источником Н является Н2СО3 которая образуется в обкладочных клетках желудка из СО2 диффундирующего из крови и Н2О под действием фермента карбоангидразы карбонатдегидратазы: Н2О СО2 → Н2СО3 → НСО3 H Диссоциация Н2СО3 приводит к образованию бикарбоната который с участием специальных...
81488. Диагностическое значение биохимического анализа желудочного и дуоденального сока. Дать краткую характеристику состава этих соков 109.1 KB
  Анализ желудочного сока является очень важным методом исследования больных с заболеваниями желудка кишечника печени желчного пузыря крови и пр Составная часть Единицы СИ Азот: небелковый 143 343 ммоль л мочевины и аммиака 499 999 ммоль л аминокислот 143 57 ммоль л Хлориды 1551 ммоль л Свободная хлористоводородная кислота 20 ммоль л Мочевая кислота 476 1189 мкмоль л Калий 56 353 мэкв л ммоль л Натрий 313 1893 мэкв л ммоль л Общая кислотность 4060 ммоль л Свободная соляная кислота 2040 ммоль л Связанная соляная кислота...
81489. Протеиназы поджелудочной железы и панкреатиты. Применение ингибиторов протеиназ для лечения панкреатитов 115.09 KB
  Протеолитические ферменты трипсин химотрипсин эластаза карбоксипептидазы А и В выделяются панкреацитами в неактивном состоянии что предотвращает самопереваривание клеток. Трипсин. Трипсиноген и трипсин получены в кристаллическом виде полностью расшифрована их первичная структура и известен молекулярный механизм превращения профермента в активный фермент. В опытах in vitro превращение трипсиногена в трипсинкатализируют не только энтеропептидаза и сам трипсин но и другие протеиназы и ионы Са2.