Во-первых, некоторый фон для вставки.
Существует несколько этапов, когда может происходить вставка (например):
- во время компиляции, компилятор может решить (или нет)для встроенного вызова.
- во время соединения, если LTO включен, компоновщик может решить встроить некоторые вызовы.
- во время загрузки для языков, которые его поддерживают.
Все они имеют общую точку: они выборочно встроены, т. Е. Стоит ли это в точке вызова.
В C ++ вы можете намекнуть компилятору, что функция может быть полезна для встраиванияиспользуя inline
, но он все равно выполнит анализ производительности со своей собственной эвристикой.Основное использование заключается в том, что свободные функции, объявленные как встроенные, не приводят к сбоям связи из-за дублирования символов.
MSVC также поддерживает __forceinline
, что приводит к действию inline ..., если это невозможно (виртуальный вызов, указатель функции, / O0, ...)
Поэтому: насколько я знаю, на самом деле невозможно форсировать / предотвратить встраивание.LTO даже позволяет (в некоторых случаях) использовать виртуальные методы (что требует анализа всей программы, поэтому подходит только на этапе exec).