Я не уверен, правда ли это. Однако, если вы берете адрес функции, эта функция должна существовать в памяти вместе с преамбулой функции и кодом очистки. Это преамбула и очистка, которые пропускаются при вставке. И вы получаете целую кучу возможностей оптимизации, когда встроены.
Но современный компилятор все еще должен иметь возможность встроить функцию везде, где это возможно. Рассмотрим:
int compare (int a, int b)
{
return a compared to b
}
int main ()
{
a = array of ints
qsort (a, compare); // take address of compare function, thus compare function exists in
// app as a proper function
compare (value1, value2); // there's no reason why this can't be inlined
}
Я думаю, что цитата должна быть более точной о том, что нельзя вставить:
Функция, которая вызывается через указатель функции, не может быть встроена.
Это связано с тем, что во время компиляции невозможно определить, какую функцию встроить в точке косвенного вызова (вызова через указатель функции). Это не означает, что функция, на которую указывает указатель функции, не может быть встроена, где бы она ни вызывалась напрямую.