Предположим, у вас есть этот код:
void foo() { bar(); }
int main()
{
foo();
foo();
foo();
}
Если foo
встроен, то компилятор по существу перепишет код следующим образом:
int main()
{
bar();
bar();
bar();
}
Теперь, если вместо bar();
у вас был более сложный фрагмент кода, тогда этот фрагмент кода появлялся бы (и компилировался) три раза, а не один раз.
Вы платите за вызов функции за счет увеличенного и повторяющегося кода.
Компилятор вполне может отказаться от встроенной функции.Если вы когда-нибудь возьмете адрес foo
и передадите его где-нибудь снаружи, вы даже не сможете обойтись без создания автономной версии.На практике произойдет удачное сочетание отдельных элементов и встраивания, в зависимости от того, что подходит лучше всего.(Более важным для того, какой код генерируется в конечном итоге, является влияние ключевого слова inline
на правило с одним определением.)