#c #optimization #stl
#c #оптимизация #stl
Вопрос:
Предположим, у меня есть функция из 10 строк. Если я добавлю ключевое слово inline, допустим, есть вероятность 50%, что компилятор сделает его встроенным.
Если у меня есть двухстрочная функция, вероятность того, что она будет встроенной, может составлять 90%.
Могу ли я разделить код в 10-строчной функции на 5 функций, чтобы сделать его встроенным с большей вероятностью?
Комментарии:
1. Не пытайтесь превзойти систему. Их компилятор решает, что лучше для вас, потому что у вас нет инструментов для принятия правильного решения (если только вы не пишете встроенные алгоритмы). Если вы хотите принудительно встроить, проверьте документацию вашего компилятора, возможно, там есть переключатель для принудительного перевода компилятора в режим inline.
Ответ №1:
Может быть причина, по которой компилятор не встраивает ее, возможно, есть на что обратить внимание. Кроме того, накладные расходы на вызов функции становятся меньшей проблемой при использовании более длинных функций, поэтому их встраивание может быть не столь важным (если это ваша единственная причина).
Разделение функции на 5 небольших функций просто внесет беспорядок в ваш код и, возможно, запутает компилятор, в результате чего он ничего не будет встраивать. Я бы не рекомендовал этого.
В зависимости от вашего компилятора C вы можете заставить его встроить функцию. Visual C имеет __forceinline
атрибут, а также параметр для того, как следует обрабатывать встраивание и как часто его следует использовать в настройках проекта. Как упоминает Тони, эквивалентом GCC является __attribute__((always_inline))
.
Вы также можете использовать некоторые хитрости препроцессора для встраивания самого кода, но обычно я бы этого не рекомендовал.
Комментарии:
1. Для GCC, например
inline void foo(char) __attribute__((always_inline));
Ответ №2:
Если это делает код более читаемым, дерзайте. Если нет, доверьтесь компилятору и не портите свой код в надежде, что это поможет. Компилятор намного умнее, чем вы думаете, и, как правило, лучше вас знает, когда встраивание поможет, а когда нет или, что еще хуже, приведет к сбоям.