Что произойдет, если компилятор встраивает функцию, которая вызывается через указатель функции
Скажем, у меня есть функция в моей программе и где-то в моем коде, эта функция вызывается через указатель функции. Что произойдет, если компилятор выполнит эту функцию, или компилятор поймет, что есть указатель на функцию, назначенный этой функции, и поэтому избегайте ее вложения.
Ответы
Ответ 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() прямого вызова без использования указателя функции.
Но, конечно, это предполагает, что компилятор может определить, какая функция вызывается из кода, что очевидно в этом случае, но если есть задействованные решения времени выполнения, это может и не сделать.