зачем вам конкретные примеры того, как встраивание снижает производительность? Это такой контекстно-зависимый вопрос. Это зависит от ряда аппаратных факторов, включая скорость оперативной памяти, модель процессора, версию компилятора и ряд других факторов. Можно создать такой пример на моем компьютере, но он все равно будет быстрее, чем не встроенная версия, не ваша. А встраивание, в свою очередь, может включить десятки других оптимизаций компилятора, которые иначе не были бы выполнены. Таким образом, даже в случае, когда раздувание кода вызывает снижение производительности, это может позволить некоторым компиляторам выполнить ряд других оптимизаций, чтобы компенсировать это.
Таким образом, вы не получите более значимого ответа, чем теория, о почему может привести к более медленному коду.
Если вам нужен конкретный пример того, как производительность может быть подорвана с помощью встраивания, тогда напишите это. Это не так сложно, если вы знаете теорию.
Вам нужна функция, которая достаточно велика, чтобы загрязнять кеш, если она встроена, и вы хотите вызывать ее из нескольких разных, но тесно связанных между собой мест (если вы вызываете ее из двух совершенно разных модулей, то два экземпляра объекта В любом случае функция не будет конкурировать за пространство кеша, но если вы быстро переключаетесь между несколькими разными сайтами вызовов, то каждое создание может вынудить предыдущее из кэша.
И, конечно, функция должна быть написана так, чтобы мало что из нее могло быть устранено, когда она встроена. Если после встраивания компилятор сможет удалить 80% кода, это снизит производительность, которую вы могли бы получить в противном случае.
И, наконец, вам, вероятно, придется принудительно включить его. В лучшем случае компиляторы склонны рассматривать ключевое слово inline
как подсказку (иногда даже не это). Поэтому вам, вероятно, придется искать специфичные для компилятора способы заставить функцию быть встроенной.
Вы также можете отключить другие оптимизации, так как в противном случае компилятор мог бы оптимизировать встроенную версию.
Так что довольно просто создавать медленный код с помощью встраивания, если вы знаете, что делать. Но для этого достаточно много работы, особенно если вам нужно что-то близкое к предсказуемым или детерминированным результатам. И, несмотря на ваши усилия, компиляторы следующего года или центральные процессоры следующего года, возможно, снова смогут перехитрить вас и генерировать более быстрый код из вашего намеренно «чрезмерно встроенного» кода.
Так что я просто не понимаю, зачем тебе это делать. Примите, что чрезмерное встраивание может повредить в некоторых случаях, и поймите , почему это может повредить. Кроме того, зачем?
И последнее: эти предупреждения часто вводят в заблуждение, потому что предупреждать очень мало. Поскольку компилятор, как правило, сам выбирает, что встроить, и в лучшем случае рассматривает ключевое слово inline
как подсказку, обычно не имеет значения независимо от того, пытаетесь ли вы встроить все.
Таким образом, хотя чрезмерное встраивание может снизить производительность, чрезмерное использование ключевого слова inline
1034 * обычно не делает.
Ключевое слово inline
имеет другие эффекты, которые должны определять его использование. Используйте его, если вы хотите отключить правило единого определения, чтобы предотвратить ошибки компоновщика, когда функция определена в нескольких единицах перевода.