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-функцию Get(). Две других функции класса есть обычными, так как реализация этих функций вынесена за границы класса.

// класс, который содержит inline-функции
class CMyPoint
{
    int x, y;

    public:
    // конструктор класса
    CMyPoint(void);

    int GetX(void); // обычная (не inline) функция класса

    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 функцию, которая содержит статические члены данных.


Связанные темы