При разработке С99 было добавлено ключевое слово inline, которое применяется к функциям. Ставя inline в начале объявления функции, вы предлагаете компилятору оптимизировать вызовы к этой функции. Обычно это означает, что при компиляции код этой функции будет вставляться на месте вызовов. Однако ключевое слово inline является всего лишь запросом к компилятору и может быть проигнорировано. В С99 особо отмечено, что использование inline «предполагает, что вызовы функции должны быть максимально быстрыми». Спецификатор inline также поддерживается в языке C++, и синтаксис С99 для этого ключевого слова совместим с C++.
Чтобы создать встраиваемую функцию[1], перед ее определением поставьте ключевое слово inline. Например, в следующей программе оптимизируются вызовы функции max():
#include <stdio.h>
inline int max(int a, int b)
{
return a > b ? a : b;
}
int main(void)
{
int x=5, y=10;
printf("Наибольшим из чисел %d и %d является: %d\n", x, y, max(x, y));
return 0;
}
При типичной реализации inline предшествующая программа эквивалентна следующей:
#include <stdio.h>
int main(void)
{
int x=5, y=10;
printf("Наибольшим из чисел %d и %d является: %d\n", x, y, (x>y ? x : y));
return 0;
}
Причина, по которой встраиваемым функциям придается такое большое значение, состоит в том, что они помогают создавать более эффективный код, поддерживая при этом структурированный, функционально-ориентированный подход. Как вы знаете, каждый раз при вызове функции механизм ее вызова и возврата требует значительного количества ресурсов. Обычно при вызове функции ее аргументы заталкиваются в стек, содержимое различных регистров заносится в память, а затем при возврате функции содержимое этих регистров восстанавливается. Беда в том, что на эти операции требуется время. Однако, если код функции подставляется вместо вызова, такие операции уже не нужны. Впрочем, хотя такие подстановки функции и способствуют ускорению выполнения, но они приводят к увеличению размера кода из-за дублирования кода функции. По этой причине лучше всего использовать inline только с очень небольшими функциями, т.е. подставлять код только маленьких функций. Кроме того, хорошо было бы применять это ключевое слово только к тем функциям, которые существенно влияют на производительность программы.
Помните: хотя inline обычно приводит к подстановке кода функции на месте ее вызова, компилятор может проигнорировать этот запрос или использовать некоторые другие средства оптимизации вызовов функции.
[1]Называется также подставляемой функцией.