Ключевое слово inline

Содержание

При разработке С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]Называется также подставляемой функцией.