встаиваемые (inline) функции в неизменном виде вставляються телом в место своего вызова.
Причина использования inline-функции заключается в их эффективности. Всякий раз, когда вызывается функция, необходимо выполнить серию инструкций для формирования вызова функции, вставки аргументов в стек и возврата значения из функции. В некоторых случаях для этого приходится использовать много тактов центрального процессора. При использовании inline-функции нет необходимости в таких дополнительных действиях и скорость выполнения программы возрастает.
Как в С так и в С++ ключевое слово inline не гарантирует встраивания функции в вызывающий код, а является лишь пожеланием компилятору, что данная функция должна вызываться настолько быстро, насколько возможно. Поэтому осязаемым эффектом ключевого слова inline является только то, как оно влияет на правила объявления и определения функций.
Однако в тех случаях, когда размер inline-функции достаточно большой, общий объем программы также возрастает. Поэтому в качестве inline-функции обычно используются очень маленькие функции. Большие функции реализуются обычным способом.
Если рассматривать функции с внутренним связыванием, т.е. функции, объявленные как static inline, то разницы между C и С++ фактически нет. Однако как только речь заходит о функциях с внешним связыванием, то разница между языками довольна значительна.
В С++ правила просты: допускаются множественные определения inline функций (в разных единицах трансляции). При этом если функция объявлена inline в одной единице трансляции, то и во всех остальных единицах трансляции, где она объявлена, она должна быть объявлена именно inline. Во всех единицах трансляции, где эта функция определена, она должна быть определена одинаково.
В языке С же проводится довольно запутанное деление между inline-определениями функции и external-определениями функции.
Inline-определение возникает тогда, когда в данной единице трансляции все объявления данной функции сделаны с ключевым словом inline, но ни одно не содержит ключевого слова extern. В такой ситуации определение функции не создает внешнего символа - к нему нельзя прилинковаться из другого объектного файла.
В inline-определениях запрещается определять модифицируемые статические объекты и thread-локальные объекты. Также оттуда нельзя ссылаться на сущности (объекты и функции) с внутренним связыванием.
External-определение возникает тогда, когда в данной единице трансляции либо есть «обычное» объявление функции (без inline), либо объявление сразу с двумя ключевыми словами extern inline. External-определение является обычной функцией - оно порождает внешний символ к которому можно прилинковаться из другого объектного файла - достаточно сделать там объявление этой функции.