Inline функції-члени класу

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 функцію, яка містить статичні члени даних.


Зв’язані теми