c++ - votes - rs add force




Когда использовать встроенную функцию и когда ее не использовать? (9)

Встроенные функции могут улучшить производительность вашего кода за счет устранения необходимости вставлять аргументы в стек. если рассматриваемая функция находится в критичной части вашего кода, вы должны сделать встроенное не встроенное решение в части оптимизации вашего проекта,

вы можете больше узнать о inline в c ++ faq

Я знаю, что inline является подсказкой или запросом к компилятору и используется для предотвращения накладных расходов на вызовы функций.

Итак, на каком основании можно определить, является ли функция кандидатом для встраивания или нет? В таком случае следует избегать встраивания?


Говорить компилятору о встроенной функции - это оптимизация, и наиболее важным правилом оптимизации является то, что преждевременная оптимизация является корнем всего зла. Всегда пишите четкий код (используя эффективные алгоритмы), затем проецируйте свою программу и оптимизируйте слишком длинные функции.

Если вы обнаружите, что определенная функция очень короткая и простая, и она называется десятками тысяч раз в жесткой внутренней петле, это может быть хорошим кандидатом.

Тем не менее, вы можете быть удивлены - многие компиляторы C ++ автоматически встраивают в вас небольшие функции, и они могут также игнорировать ваш запрос на inline.


Кроме того, встроенный метод имеет серьезные побочные эффекты при сохранении больших проектов. Когда изменяется встроенный код, все файлы, которые его используют, будут автоматически перестраиваться компилятором (это хороший компилятор). Это может потратить много времени на разработку.

Когда inline метод переносится в исходный файл и не встраивается в него, весь проект должен быть перестроен (по крайней мере, это был мой опыт). А также когда методы преобразуются в inline.


Лучший способ узнать - это профилировать свою программу и отмечать небольшие функции, которые вызываются много раз и записываются через циклы процессора, которые являются inline . Ключевое слово здесь «маленькое» - как только накладные расходы на функцию пренебрежимо малы по сравнению с временем, затраченным на функцию, бессмысленно встраивать их.

Другое использование, которое я предлагаю, заключается в том, что у вас есть небольшие функции, которые вызываются в критическом критически важном коде, достаточно часто, чтобы сделать пропущенную кэш-память релевантной, вы, вероятно, должны включить их также. Опять же, это то, что профилировщик должен сказать вам.


Нужно использовать спецификатор встроенной функции только в том случае, если код функции мал. Если функции больше, вам следует предпочесть нормальные функции, так как экономия в памяти занимает сравнительно небольшую жертву в скорости выполнения.


Преждевременная оптимизация - это корень всех злых!

Как правило, я обычно устанавливаю только «геттеры» и «сеттеры». Как только код работает и стабилен, профилирование может показать, какие функции могут извлечь выгоду из вложения.

С другой стороны, у большинства современных компиляторов есть неплохие алгоритмы оптимизации, и они будут встроены в то, что вы должны были сделать для вас.

Повторное вычисление - записывайте встроенные функции с одним слоем, а потом беспокоитесь о других.


Я обычно следую правилу большого пальца, где я делаю функцию с тремя простыми операторами, такими как inline. Но хорошо помнить, что это всего лишь намек на компилятор. Последний вызов, чтобы сделать его встроенным или нет, принимается только компилятором. Если есть больше, чем эти многие утверждения, я не буду объявлять inline, как с глупым компилятором, это может привести к раздуванию кода.


Я прочитал несколько ответов и вижу, что некоторые вещи отсутствуют.

Правило, которое я использую, - это не использовать встроенный, если я не хочу, чтобы он был встроенным. Выглядит глупо, теперь объяснение.

Компиляторы достаточно умны, а короткие функции всегда делают встроенным. И никогда не делает длинную функцию встроенной, если программист не сказал это сделать.

Я знаю, что inline - это подсказка или запрос на компилятор

Фактически inline - это заказ для компилятора, у него нет выбора, и после того, как ключевое слово inline делает весь код встроенным. Таким образом, вы никогда не сможете использовать inline ключевое слово, а компилятор разработает самый короткий код.

Так когда использовать inline ?

Использовать, если вы хотите иметь встроенный код. Я знаю только один пример, потому что я использую его только в одной ситуации. Это аутентификация пользователя.

Например, у меня есть эта функция:

inline bool ValidUser(const std::string& username, const std::string& password)
{
    //here it is quite long function
}

Независимо от того, насколько велика эта функция, я хочу иметь ее как встроенную, потому что это затрудняет работу с моим программным обеспечением.


inline имеет очень мало общего с оптимизацией. inline - это инструкция для компилятора, чтобы не создавать ошибку, если функция данного определения встречается несколько раз в программе и обещает, что определение будет происходить в каждом переводе, который используется, и везде, где он появляется, он будет иметь точно такое же определение ,

Учитывая приведенные выше правила, inline подходит для коротких функций, чье тело не требует включения дополнительных зависимостей в зависимости от того, что потребуется для объявления. Каждый раз при обнаружении дефиниции он должен быть проанализирован, а код для его тела может быть сгенерирован, поэтому он подразумевает некоторые накладные расходы компилятора над функцией, определенной только один раз в одном исходном файле.

Компилятор может встроить (т. Е. Заменить вызов функции кодом, который выполняет это действие этой функции) любой вызов функции, который он выбирает. Раньше это было так, что «очевидно» не могло встроить функцию, которая не была объявлена ​​в той же самой системе перевода, что и вызов, но с увеличением использования оптимизации времени ссылки, даже это сейчас не так. Не менее верно тот факт, что функции, отмеченные inline могут не быть вложенными.







inline