Подставляемые функции быстрее, потому что Вы не должны продвигать и выталкивать вещи вкл\выкл стек как параметры и обратный адрес; однако, это действительно делает Ваш двоичный файл немного больше.
это имеет значительное значение? Не заметно достаточно на современных аппаратных средствах для большинства. Но это может иметь значение, которое является достаточно для некоторых людей.
отмечание, которое что-то встраивает, не дает Вам гарантию, что это будет встроено. Это - просто предложение к компилятору. Иногда это не возможно такой как тогда, когда у Вас есть виртуальная функция, или когда существует включенная рекурсия. И иногда компилятор просто принимает решение не использовать его.
я видел, что такая ситуация имела обнаруживаемое значение:
inline int aplusb_pow2(int a, int b) {
return (a + b)*(a + b) ;
}
for(int a = 0; a < 900000; ++a)
for(int b = 0; b < 900000; ++b)
aplusb_pow2(a, b);
Встраивание является предложением к компилятору, который это свободно проигнорировать. Это идеально для маленьких битов кода.
, Если Ваша функция встраивается, она в основном вставляется в код, где вызов функции сделан к ней, вместо того, чтобы на самом деле вызвать отдельную функцию. Это может помочь со скоростью, поскольку Вы не должны делать фактического вызова.
Это также помогает центральным процессорам с конвейерной обработкой, поскольку они не должны перезагружать конвейер с новыми инструкциями, вызванными вызовом.
единственный недостаток является возможным увеличенным двоичным размером, но, пока функции являются небольшими, это не будет иметь значения слишком много.
я склонен оставлять эти виды решений к компиляторам в наше время (хорошо, умные так или иначе). Люди, которые записали им, склонны иметь намного более детальное знание базовой архитектуры.
return 42 ;
оператор. Это для меня экстремальное значение, встраивающее . Это редко происходит в реальной жизни, это делает время компиляции дольше, не чрезмерно увеличит размер Вашего кода и сделает Ваш код быстрее. Но как чаша Грааля, не пытайтесь применить его везде, потому что большая часть обработки не может быть разрешена этот путь... Однако, это прохладно так или иначе... Во время оптимизации много компиляторов будут подставляемые функции, даже если Вы не отметили их. Вообще только необходимо отметить функции как встроенные, если Вы знаете что-то, что компилятор не делает, поскольку он может обычно принимать само корректное решение.
Вообще говоря, в эти дни с любым современным компилятором, вызывающим беспокойство о встраивании чего-либо, в значительной степени пустая трата времени. Компилятор должен на самом деле оптимизировать все эти соображения для Вас посредством его собственного анализа кода, и Ваша спецификация флагов оптимизации передала компилятору. Если Вы заботитесь о скорости, говорите компилятору оптимизировать для скорости. Если Вы заботитесь о пространстве, говорите компилятору оптимизировать для пространства. Поскольку другой ответ сослался на, достойный компилятор даже встроит автоматически, если это действительно будет иметь смысл.
кроме того, как другие заявили, с помощью встроенного, не гарантирует встроенный ни из чего. Если Вы хотите гарантировать его, необходимо будет определить макрос вместо подставляемой функции, чтобы сделать это.
, Когда встроить и/или определить макрос для принуждения включения? - Только, когда у Вас есть продемонстрированное и необходимое доказанное увеличение скорости для критического раздела кода, который, как известно, имеет влияние на общей производительности приложения.
Заключение от другое обсуждение здесь:
там какие-либо недостатки с подставляемыми функциями?
, По-видимому, нет ничего неправильно с использованием подставляемых функций.
, Но стоит отметить следующие моменты!
Злоупотребление встраиванием может на самом деле сделать программы медленнее. В зависимости от размера функции, встраивая его может заставить размер кода увеличиваться или уменьшаться. Встраивание очень небольшой функции средства доступа будет обычно уменьшать размер кода, в то время как встраивание очень большой функции может существенно увеличить размер кода. На современных процессорах меньший код обычно работает быстрее из-за лучшего использования кэша инструкции. - Google Guidelines
преимущества скорости подставляемых функций имеют тенденцию уменьшаться, поскольку функция увеличивается в размере. В какой-то момент издержки вызова функции становятся маленькими по сравнению с выполнением тела функции, и преимущество потеряно - Источник
существует немного ситуаций, где подставляемая функция не может работать:
__inline
ключевое слово заставляет функцию быть встроенной, только если Вы определяете оптимизировать опцию. Если оптимизируют, определяется, соблюдается ли __inline
, зависит от установки встроенной опции оптимизатора. По умолчанию встроенная опция состоит в действительности в том каждый раз, когда оптимизатор выполняется. Если Вы определяете, оптимизируют, необходимо также определить noinline опцию, если Вы хотите __inline
ключевое слово быть проигнорированными. - Источник
Я хотел бы добавить, что встроенные функции очень важны, когда вы создаете общую библиотеку. Если не обозначить функцию inline, она будет экспортирована в библиотеку в двоичном виде. Она также будет присутствовать в таблице символов, если она экспортирована. С другой стороны, встроенные функции не экспортируются ни в двоичные файлы библиотеки, ни в таблицу символов.
Это может быть критично, когда библиотека предназначена для загрузки во время выполнения. Это также может повлиять на библиотеки, поддерживающие бинарную совместимость. В таких случаях не используйте inline.