68942

Inline функції

Лекция

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

Визначення функцій що підставляються усередині класу Мова C володіє важливою властивістю: у нім існують функції inline functions що підставляються які широко використовуються в класах. Щоб замінити виклик функції підстановкою перед її визначенням слід вказати слово inline.

Украинкский

2014-09-27

36.5 KB

0 чел.

Лекція № 4

Тема: Inline функції

План:

  1.  Inline функції

2. Визначення функцій, що підставляються, усередині класу

 

Мова C++ володіє важливою властивістю: у нім існують функції (inline functions), що підставляються, які широко використовуються в класах. Можна написати коротку функцію, яка не викликається, а підставляється у відповідне місце програми. Цей процес нагадує функціональну макропідстановку. Щоб замінити виклик функції підстановкою, перед її визначенням слід вказати слово inline. Наприклад, в наступній програмі функція мах () не викликається, а підставляється.

#include <iostream>

using namespace std;

inline int max(int а, int b)

{

return a>b ? а : b;

}

int main() {

cout « max(10, 20);

cout « " " « max(99, 88);

return 0;

}

З погляду компілятора ця програма виглядає так.

include <iostream>

using namespace std;

 

int main() {

cout « (10>20 ? 10 : 20);

cout « " " « (99>88 ? 99 : 88);

return 0;

}

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

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

Функції, що підставляються, можуть бути членами класу. Наприклад, наступна програма вважається цілком коректною.

#include <iostream>

using namespace std;

class myclass {

int а, b; public:

void init(int i, int j);

void show();

};

// Створити функцію, що підставляється,

inline void myclass::init(int i, int j)

{

а = i;

b = j;

}

// Створити іншу функцію, що підставляється.

inline void myclass::show()

{

cout « а « " " « b « "\n";

}

 

int main() {

myclass x;

x.initdO, 20); x.show();

return 0;

}

Ключове слово inline не є частиною мови С. Отже, воно не визначене в стандарті С89, але включене в стандарт С99.

Визначення функцій, що підставляються, усередині класу

Коротку функцію можна визначити безпосередньо усередині оголошення класу. Якщо функція визначена усередині оголошення класу, вона автоматично перетворюється на ту, що підставляється (якщо це не перечить обмеженням компілятора). Указувати при цьому ключове слово inline абсолютно не обов'язково, хоча помилкою це не вважається. Наприклад, попередню програму можна переписати, помістивши визначення функцій init() і show() у оголошення класу myclass.

#include <iostream>

using namespace std;

class myclass {

int а, b; public:

// Автоматична підстановка

void init(int i, int j) { a=i; b=j; }

void show() { cout « а « " " « b « "\n"; }

};

int main() {

myclass x;

x.initdO, 20);

x.show();

return 0;

}

Зверніть увагу на спосіб запису тіла функції усередині оголошення класу myclass. Оскільки функції, що підставляються, зазвичай короткі, такий прийом цілком типовий. Проте абсолютно необов'язково записувати функції саме так. Наприклад, оголошення функції myclass можна переписати інакше.

include <iostream>

using namespace std;

class myclass {

int а, b; public:

// Автоматична підстановка

void init(int i, int j)

{

а  =   i; b  =   j; }

void show() {

cout <<  а <<   "   "   << b «   "\n";

}

};

З технічної точки зору підстановка функції show() не має сенсу, оскільки час, що витрачається на уведення-виведення, набагато перевищує час, необхідний для виклику функції. Проте переважна більшість програмістів вважають за краще поміщати всі короткі функції-члени усередині оголошення класу. (Украй рідко в професійних програмах можна зустріти короткі функції-члени, визначені зовні оголошення класу.)

Конструктор і деструкція можуть бути такими, що підставляються або за умовчанням, якщо вони визначені усередині оголошення класу, або явно.


 

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

77961. Облік основних засобів 317.5 KB
  Облік основних засобів Поняття про основні засоби. Класифікація та оцінка основних засобів. Первинні документи з обліку основних засобів. Облік та порядок придбання вибуття ремонту основних засобів.
77962. Облік нематеріальних активів 64 KB
  Первинна вартість НМА придбаного в результаті обміну на подібний обєкт дорівнює залишковій вартості переданого нематеріального активу. Якщо залишкова вартість переданого обєкту перевищує його справедливу вартість то первинною вартістю НМА отриманого в обмін на подібний обєкт є його справедлива вартість з включенням різниці у фінансові результати витрати звітного періоду...
77963. Острый и хронический пиелонефрит 20.61 KB
  Наиболее частым возбудителем пиелонефрита является кишечная палочка реже – стафилококки энтерококки протей клебсиелла. ХП как правило является следствием ранее перенесенного острого пиелонефрита. Факторы способствующие развитию пиелонефрита: нарушение оттока мочи создающее благоприятные условия для роста и размножения микроорганизмов: обратный заброс мочи рефлюксы на различных уровнях вследствие атонии мочевых путей опухоли мочевых путей и предстательной железы почечнокаменная болезнь; нарушение кровоснабжения почек...
77964. Гломерулонефрит 18.25 KB
  Острый гломерулонефрит – острое иммуновоспалительное заболевание почек с преимущественным поражением клубочков и в меньшей степени канальцев и интерстициальной ткани.
77965. Хроническая почечная недостаточность 49 KB
  ХПН не является самостоятельным заболеванием а представляет собой конечную фазу любого прогрессирующего заболевания почек. В норме в почках около 2 млн нефронов клинические проявления ХПН появляются тогда когда остается меньше 30 нефронов. При ХПН нарушается водный баланс развивается полиурия никтурия снижается относительная плотность мочи развивается изостенурия выделение мочи с монотонно низким удельным весом осмотическому давлению мочи = плазмы крови в полиурической фазе развиваются симптомы дегидратации.
77966. Мочекаменная болезнь 15.49 KB
  По химическому составу конкрементов выделяют: оксалаты ураты карбонаты фосфаты и органические камни. Большие камни лежащие в лоханке без движения могут не беспокоить больного или проявляться тупой длительной болью в поясничной области в связи с присоединением воспалительного процесса. Диагностика: клиническая картина изменения в оам небольшая протеинурия гематурия единичные цилиндры и соли рентгенологические методы выявляют уратные цистиновые и смешанные камни сочетают с УЗИ. При уратных конкрементах используются препараты...
77967. Основные симптомы заболеваний мочевыделительной системы. Лабораторные и инструментальные методы диагностики 22.88 KB
  Изменение цвета мочи Нефротический синдром. Преимущественная локализация На нижних конечностях На лице мешки под глазами Время суток К концу дня Утром Характер отеков Плотные ямки остаются долго Мягкие Рыхлые подвижные ямки быстро исчезают Цвет кожи над отеками Цианотичная Бледная Симптомы обусловленные расстройством мочеотделения Полиурия увеличение суточного количества мочи более 2 л Олигурия уменьшение количества мочи менее 500 мл. Анурия – уменьшение суточного количества мочи менее 100150 мл или полное отсутствие...
77968. Организация меню. Создание главного и контекстного меню 54 KB
  Создание главного и контекстного меню Для создания меню используют 2 компоненты: TMinMenu и TPopupMenu расположенные на странице Stndrd. Компонент класса TMinMenu определяет главное меню формы. На форму можно поместить сколько угодно объектов этого класса но отображаться в полосе меню в верхней части формы будет только тот из них который указан в свойстве Menu формы.
77969. Создание и работа со списками 80 KB
  Компонент класса TListBox представляет собой стандартный для Windows список выбора с помощью которого пользователь может выбрать один или несколько элементов выбора. В компоненте предусмотрена возможность программной прорисовки элементов поэтому список может содержать не только строки но и произвольные изображения. Если MultiSelect=Flse совпадает с индексом выделенного элемента TBorderStyle: перечисл Определяет стиль рамки: bsNone нет рамки; bssingle рамка толщиной 1 пиксель Count: Integer; Содержит количество строк в компоненте...