Компилятор будет ОПРЕДЕЛЕННО производить регулярную функцию, если встроенная функция имеет принятый адрес (то есть вы создаете для него указатель на функцию или что-то подобное). И, конечно, если функция virtual
, она также должна существовать как отдельная функция, поскольку вызов функции virtual
не всегда возможен.
Кроме этого, он полностью зависит от компилятора - он использует всевозможные эвристики, такие как «Насколько велика функция?», «Сколько раз это называется?», «Сколько« выигрыша » там от вставки его? ». Если функция вызывается много раз и достаточно велика, она, вероятно, остается автономной функцией. Если функция вызывается только несколько раз, или она крошечная, то она встроена [предполагается, что компилятор действительно МОЖЕТ вставить ее, конечно, как описано выше, возможно, она не сможет]. Кроме того, почти все компиляторы должны «видеть» исходный код функции, чтобы встроить эту функцию, но как GCC/G ++, так и MSVC имеют отношение к «оптимизации всей программы», предназначенное для преодоления этой проблемы.
Другими словами, вы можете только «знать», читая полученный машинный код - в некоторых случаях есть также расширенные сообщения «предупреждения» или «заметки», которые вы можете включить, чтобы сообщить компилятору дать вам информацию о «Я не встроил функцию Func1
, потому что ... вставляем какую-то причину здесь ...».
В каких обстоятельствах компилятор преобразует встроенную функцию в регулярную функцию? IMHO, это вопрос конкретного уровня оптимизации, который вы используете для компиляции, и конкретной реализации компилятора в целом. –