Некоторые общие аспекты:
- опция компилятора (отладочной версии обычно не инлайн, и большинство компиляторов имеют варианты, чтобы переопределить встроенный декларация, чтобы попытаться встроить все или нет)
- подходящее соглашение о вызове (например, функции varargs обычно не вложены)
- подходит для встраивания: зависит от размера функции, частоты вызова функции, усиления через вставку, и набор оптимизации (скорость и размер кода). Часто крошечные функции имеют больше преимуществ, но огромная функция может быть встраиваемыми, если она вызывается только один раз
- глубины рядных вызовов и рекурсивной настройки
3-я, вероятно, суть вашего вопроса, но это на самом деле «специфические эвристики для компилятора» - вам нужно проверить документы компилятора, но обычно они не будут давать много гарантий. MSDN имеет некоторую (ограниченную) информацию для MSVC.
Помимо мелочей (например, простых геттеров и очень примитивных функций), вставка как таковая больше не нужна. Стоимость инструкции вызова снизилась, и предсказание ветвлений значительно улучшилось.
большие возможности для встраивание является удаление пути кода, который знает, что компилятор не будет принято - как крайний пример:
inline int Foo(bool refresh = false)
{
if (refresh)
{
// ...extensive code to update m_foo
}
return m_foo;
}
Хороший компилятор будет встраивать Foo(false)
, но не Foo(true)
.
С Link Время генерации кода, Foo
может находиться в .cpp (без inline
declararion), и Foo(false)
все равно будет встраиваемыми, так что опять рядный имеет лишь незначительное воздействие здесь.
Резюмируя: Есть несколько сценариев, в которых вы должны попытаться принять ручное управление встраивание путем размещения (или опуская) встроенные заявления.
Это не просьба - это рекомендация. Решение зависит от компилятора – chester89