Встраиваемые функции в С++
В C++ можно задать функцию, которая на самом деле не вызывается, а ее тело встраивается в программу в месте ее вызова. Преимуществом встраиваемых (in-line) функций является то, что они не связаны с механизмом вызова функций и возврата ими своего значения. Это значит, что встраиваемые функции могут выполняться гораздо быстрее обычных.
b<>Замечание. Выполнение машинных команд, которые генерируют вызов функции и воз-вращение функцией своего значения, занимает определенное время. Если функция имеет параметры, то ее вызов занимает еще большее время.
Недостатком встраиваемых функций является то, что если они слишком большие и вызываются слишком часто, объем ваших программ сильно возрастает. Из-за этого применение встраиваемых функций обычно ограничивается короткими функциями.
Для объявления встраиваемой функции просто впишите спецификатор inline перед определением функции.
Пример.
В примере функция even(), которая возвращает истину при четном аргументе, объявлена встраиваемой. Это означает, что строка
функционально идентична строке
Важно. Особенность использования встраиваемой функции: она должна быть задана до ее первого вызова. Если это не так, компилятор не будет знать, какой именно код предполагается встроить в программу с помощью встраиваемой функции. Поэтому функция even() была определена перед функцией main().
Пример. Любая функция может стать встраиваемой, включая функции — члены классов. Например, функция divisible!) для ускорения ее выполнения сделана встраиваемой. (Функция возвращает истину, если ее первый аргумент без остатка может делиться на второй.)
Пример. Допускается перегружать встраиваемую функцию. Программа перегружает min() тремя способами. В каждом случае функция также объявляется встраиваемой.
b<>Замечание. Выполнение машинных команд, которые генерируют вызов функции и воз-вращение функцией своего значения, занимает определенное время. Если функция имеет параметры, то ее вызов занимает еще большее время.
Недостатком встраиваемых функций является то, что если они слишком большие и вызываются слишком часто, объем ваших программ сильно возрастает. Из-за этого применение встраиваемых функций обычно ограничивается короткими функциями.
Для объявления встраиваемой функции просто впишите спецификатор inline перед определением функции.
Пример.
// Пример встраиваемой функции #includeusing namespace std; inline int even (int x) { return ! (x%2); int main () { if (even (10)) cout ≪ "10 является четным\п"; if (even (11)) cout ≪ "11 является четным\п"; return 0; }
if (even(10)) cout ≪ "10 является четным\n";
if (! (10%2)) cout ≪ "10 является четным\n";
Пример. Любая функция может стать встраиваемой, включая функции — члены классов. Например, функция divisible!) для ускорения ее выполнения сделана встраиваемой. (Функция возвращает истину, если ее первый аргумент без остатка может делиться на второй.)
// Демонстрация встраиваемой функции-члена #includeusing namespace std; class samp { int i, j; public: samp(int a, int b); int divisible(); // встраивание происходит в этом определении }; samp::samp(int a, int b) { i = a; j = b; } /* Возврат 1, если i без остатка делится на j. Тело этой функции-члена встраивается в программу */ inline int samp::divisible() { return !(i%j); } int main() { samp ob1(10, 2), ob2(10, 3); // это истина if(ob1.divisible()) cout << "10 делится на 2\n"; // это ложь if(ob2.divisible()) cout << "10 делится на 3\n"; return 0; }
#includeusing namespace std; // Перегрузка функции min() тремя способами // int inline int min(int a, int b) { return a < b ? a : b; } // long inline long min(long a, long b) { return a < b ? a : b; } // double inline double min(double a, double b) { return a < b ? a : b; } int main() { cout << min(-10, 10) << "\n"; cout << min(-10.01, 100.002) << "\n"; cout << min(-10L, 12L) << "\n"; return 0; }