Одна из причин, по которой компилятор выполняет работу лучше, чем программист, заключается в том, что компромисс между затратами и выгодами фактически определяется на самом низком уровне машинной абстракции: сколько инструкций по сборке составляют функцию, которую вы хотите встроить.Рассмотрим соотношение между временем выполнения типичной не ветвящейся инструкции сборки и вызовом функции.Это соотношение предсказуемо для генератора машинного кода, поэтому компилятор может использовать эту информацию для управления встраиванием.
Компилятор высокого уровня часто пытается позаботиться о другой возможности встраивания: когда функция Bвызывается только из функции A и никогда не вызывается из других источников.Это встраивание не выполняется по соображениям производительности (при условии, что A и B не являются небольшими функциями), но полезно для сокращения времени компоновки за счет сокращения общего числа «функций», которые необходимо сгенерировать.
Добавленные примеры
Примером того, как компилятор выполняет массивное встраивание (с огромным ускорением), является компиляция контейнеров STL.Контейнерные классы STL написаны так, чтобы быть очень универсальными, а взамен каждая «функция» выполняет лишь незначительную часть работы.Когда встраивание отключено, например, при компиляции в режиме отладки, скорость контейнеров STL значительно падает.
Второй пример может быть, когда функция вызываемого объекта содержит определенные инструкции, которые требуют, чтобы стек не нарушался между вызывающим ивызываемая.Это происходит с инструкциями SIMD, использующими встроенные функции.К счастью, компиляторы достаточно умны, чтобы автоматически встроить эти функции вызываемого абонента, потому что они могут проверить, генерируются ли инструкции сборки SIMD, и встроить их, чтобы убедиться, что стек не нарушен.
Нижняя строка
, если вы не знакомы с низкоуровневым профилированием и хорошо разбираетесь в программировании / оптимизации сборки , лучше позволить компилятору выполнить эту работу.STL - это особый случай, в котором может иметь смысл включить встраивание (с переключателем) даже в режиме отладки.