Что произойдет, если компилятор встраивает функцию, которая вызывается через указатель функции

Скажем, у меня есть функция в моей программе и где-то в моем коде, эта функция вызывается через указатель функции. Что произойдет, если компилятор выполнит эту функцию, или компилятор поймет, что есть указатель на функцию, назначенный этой функции, и поэтому избегайте ее вложения.

Ответы

Ответ 1

Когда указатель на функцию берется, компилятор будет генерировать тело вне линии для функции. По-прежнему можно встроить функцию в другие сайты вызовов.

Обратите внимание, что функция, отмеченная inline, должна иметь определение, доступное во всех TU, которые ссылаются на него, и эти определения должны быть идентичными. Это означает, что совершенно безопасно встроить функцию в некоторые сайты вызовов и сохранить ее вне очереди в других.

Ответ 2

Ну, это наверняка сработает. Я не вижу, как это будет препятствовать. У вас просто есть код, который вызывает функцию напрямую, и он может быть там встроен, и у вас есть код, который вызывает его через указатель на функцию, как обычную функцию.

Ответ 3

Нет причин, по которым использование указателя функции должно препятствовать встраиванию. Встраивание выполняется в каждом конкретном случае и может существовать наряду с обычным функциональным телом. Таким образом, функция может быть встроена в одно место и вызываться в другом.

Таким образом, компилятор будет встроен там, где он может и может вызывать функцию вызова для вашего указателя функции.

Ответ 4

Не только компилятор встрояет "другие вызовы функции", но даже может встраивать вызовы через указатели функций, если он достаточно разбирается в том, какая функция фактически используется, например:

typedef void (*funcptr)();

void somefunc()
{
   ... do stuff here ... 
}

void indirection(funcptr *f)
{
   f();
}

void call_with_ptr()
{
    funcptr f = somefunc();
    for(int i = 0; i < 100; i++)
    {
       indirection(f);
    }
}

У меня был код, похожий на этот, и он ввел косвенное направление и сделал вызов somefunc() прямого вызова без использования указателя функции.

Но, конечно, это предполагает, что компилятор может определить, какая функция вызывается из кода, что очевидно в этом случае, но если есть задействованные решения времени выполнения, это может и не сделать.