inline функції-члени класу
Зміст
- 1. Які функції називаються вбудованими (inline) функціями?
- 2. Які є способи оголошення (створення) вбудованих (inline) функцій у визначенні класу?
- 3. Приклад оголошення класу, що містить вбудовані функції (inline)
- 4. Які переваги дає використання вбудованих (inline) функцій?
- 5. У яких випадках доцільно оголошувати функції з модифікатором inline?
- 6. Які дії виконує компілятор при оголошенні inline-функції?
- 7. Причини, які можуть призвести до ігнорування ключового слова inline
- Зв’язані теми
Пошук на інших ресурсах:
1. Які функції називаються вбудованими (inline) функціями?
У мові C++ в класах можуть використовуватись два типи функцій:
- функції, які підставляються або вбудовані функції. Такі функції ще називаються inline-функціями;
- звичайні функції, код яких не підставляється безпосередньо у тіло викликаючої програми.
Inline-функції обробляються так само як макрос. При виклику такої функції з викликаючого коду, тіло функції безпосередньо вставляється у цей код. Інакше кажучи, код inline-функції підставляється у те місце рядка програми, з якого вона викликається. У результаті, виклик inline-функції дає виграш у часі виконання програми (часі обробки функції). Це пов’язано з тим, що зникають накладні витрати на додаткову обробку при передачі (отриманні) параметрів у функцію.
2. Які є способи оголошення (створення) вбудованих (inline) функцій у визначенні класу?
Існує два способи оголошення (створення) inline-функції.
Спосіб 1. З використанням модифікатора inline. Загальний вигляд функції, оголошеної з модифікатором inline наступний:
inline returned_type FunName(parameters) { // ... }
де returned_type та parameters відповідно тип та параметри, що повертаються функцією.
Не всі компілятори підтримують цей спосіб.
Спосіб 2. Реалізація коду функції-члена класу безпосередньо в тілі оголошення класу. У цьому випадку використання модифікатора inline необов’язкове.
Загальний вигляд класу з оголошеними inline-функціями має вигляд:
class CMyClass { // ... // без модифікатора inline returned_type MyInlineFun1(parameters) { // ... } // з модифікатором inline inline returned_type MyInlineFun2(parameters) { // ... } // ... }
де
- returned_type – тип, що повертається функціями;
- parameters параметри, що отримує функція.
3. Приклад оголошення класу, що містить вбудовані функції (inline)
У прикладі оголошується клас CMyPoint. Клас містить внутрішні члени даних а також inline-функцію GetY(). Дві інші функції класу є звичайними, тому що реалізація цих функцій винесена за межі класу.
// клас, що містить inline-функції class CMyPoint { int x, y; public: // конструктор класу CMyPoint(void); int GetX(void); // звичайна (не inline) функція класу int GetY(void) // inline-функція { return y; // реалізація у тілі класу } // звичайна (не inline) функція void SetXY(int nx, int ny); }; // конструктор класу CMyPoint::CMyPoint(void) { x = y = 0; } // реалізація не inline-функції GetX() int CMyPoint::GetX(void) { return x; } // реалізація не inline функції SetXY() void CMyPoint::SetXY(int nx, int ny) { x = nx; y = ny; }
Використання класу в іншому програмному коді (наприклад, обробнику події)
CMyPoint MP1; // об'єкт класу, що містить inline-функцію // виклик звичайної (не inline) функції MP1.SetXY(25,30); int tx, ty; tx = MP1.GetX(); // виклик не inline функції ty = MP1.GetY(); // виклик inline функції
4. Які переваги дає використання вбудованих (inline) функцій?
Основна перевага використання вбудованих (inline) функцій – це пришвидшення часу виконання програми. Це пов’язано з тим, що при виклику inline-функції не витрачається час на:
- запис аргументів у стек;
- читання аргументів зі стеку при поверненні з функції.
5. У яких випадках доцільно оголошувати функції з модифікатором inline?
Додавати модифікатор inline в оголошення функції доцільно у випадках, коли виконуються дві основні умови:
- виклик функції відбувається настільки часто, що негативно впливає на швидкість виконання програми або просто уповільнює виконання програми. Наприклад, функція може викликатись багатократно в операторі циклу;
- об’єм коду функції є малим. Функції, що мають великі об’єми програмного коду суттєво збільшують розмір самої програми, що, інколи, теж небажано. Тому в якості вбудованих, рекомендовано використовувати тільки дуже малі функції.
6. Які дії виконує компілятор при оголошенні inline-функції?
Оголошення inline-функції є запитом а не командою. Тому, компілятор може не виконати запит на генерування коду для оголошеної inline-функції. У цьому випадку, функція може бути використана як звичайна (не inline).
Наприклад:
- у більшості випадків рекурсивні функції не можуть бути використані як inline-функції;
- не можна згенерувати inline функцію, яка містить статичні члени даних.
7. Причини, які можуть призвести до ігнорування ключового слова inline
В деяких випадках компілятор не може визначити функцію як вбудовану і просто ігнорує ключове слово inline. Нижче перераховано можливі причини такої поведінки компілятора:
- Занадто великий розмір функції.
- Функція є рекурсивною.
- В одному й тому ж виразі функція може повторюватись декілька разів.
- У функції містяться управляючі оператори switch, if або оператори циклу.
Зв’язані теми
- Опис функції. Фактичні та формальні параметри. Передача параметрів у функцію за значенням та за адресою
- Види функцій-членів класу. Звичайні функції-члени класу. Статичні (static) функції-члени класу. Приклади використання