Встраивание выполняется для оптимизации. Однако малоизвестный факт заключается в том, что inline
также может повредить производительность: ваш процессор имеет кэш команд с фиксированным размером, а вложение имеет недостаток репликации функции в нескольких местах, что делает кеш команд менее эффективным.
Таким образом, с точки зрения производительности, это вообще не рекомендуется объявлять функции inline
, если они не являются настолько коротки, что их вызов является более дорогим, чем их исполнение.
Чтобы выразить это, вызов функции занимает от 10 до 30 циклов времени процессора (в зависимости от количества аргументов). Арифметические операции обычно выполняются за один цикл, однако загрузка памяти из кеша первого уровня занимает примерно три-четыре цикла. Итак, если ваша функция более сложна, чем простая последовательность, состоящая не более чем из трех обращений к памяти и некоторой арифметики, нет смысла указывать ее.
я обычно беру этот подход:
Если функция так же просто, как и инкремент один счетчик, и, если она используется повсюду, я встраивать его. Примеры этого встречаются редко, но один действительный случай - подсчет ссылок.
Если функция используется только в одном файле, я объявляю ее как static
, а не inline
. Это приводит к тому, что компилятор может см., когда такая функция используется точно один раз. И если он увидит это, это, скорее всего, приведет к его, независимо от того, насколько он сложный, поскольку он может доказать, что нет недостатка в инкрустации.
Все остальные функции не являются ни static
, ни inline
.
пример в вашем вопросе является пограничным примером: Он содержит вызов функции, таким образом, это кажется слишком сложными для встраивания на первый взгляд.
Однако функция memcpy()
является специальной: она рассматривается скорее как часть языка, чем как функция библиотеки. Большинство компиляторов встроят его и оптимизируют его, когда размер является небольшой константой времени компиляции, что имеет место в рассматриваемом коде.
С этой оптимизацией функция действительно сводится к короткой, простой последовательности. Я не могу сказать, затрагивает ли он много памяти, потому что я не знаю структуру, которая копируется.Если эта структура мала, добавление ключевого слова inline
представляется хорошей идеей в этом случае.
Хорошим ориентиром является использование их только после того, как обширные контрольные показатели продемонстрировали, что это полезно сделать. –
@WilliamPursell В чем заключается недостаток использования их перед тем, как делать какие-либо тесты? Я получу безразличную производительность или худшую производительность по сравнению с обычными функциями. – yasar