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-функцию 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 функцию, которая содержит статические члены данных.
7. Причины, которые могут привести к игнорированию ключевого слова inline
В некоторых случаях компилятор не может определить функцию как встроенную и просто игнорирует ключевое слово inline. Ниже перечислены возможные причины такого поведения компилятора:
- Слишком большой размер функции.
- Функция есть рекурсивной.
- В одном и том же выражении функция может повторяться несколько раз.
- В функции используются управляющие операторы switch, if или операторы цикла.
Связанные темы
- Описание функции. Фактические и формальные параметры. Передача параметров в функцию по значению и по адресу. Прототип функции
- Виды функций-членов класса. Обычные функции-члены. Статические (static) функции-члены класса. Примеры использования