встроенная функция c++?
почему я должен делать что-то вроде этого:
inline double square (double x) { return x*x;}
вместо
double square (double x) { return x*x;}
есть ли разница?
6 ответов:
первый (с помощью
inline
) позволяет поставить эту функцию в заголовочный файл, где она может быть включена в несколько исходных файлов. Используяinline
имеет идентификатор на объем файла, очень похоже на объявление егоstatic
. Без использованияinline
, вы получите ошибку определения нескольких символов от компоновщика.конечно, это в дополнение к подсказка компилятору, что функция должна быть скомпилирована inline туда, где он используется (избегая a накладные расходы на вызов функции). Компилятор не обязан действовать на
inline
намек.
Да есть разница. https://isocpp.org/wiki/faq/inline-functions.
когда вы указываете, что функция является встроенной, вы заставляете компилятор помещать код метода туда, где он вызывается.
void myfunc() { square(2); }
совпадает с
void myfunc() { 2 * 2; }
вызов функции хорош для ясности кода, но когда эта функция вызывается, локальное состояние должно быть перемещено в стек, для метода устанавливается новое локальное состояние, и когда это делается предыдущее состояние должно быть выскочил. Это много накладных расходов.
теперь, если вы поднимаете свой уровень оптимизации, компилятор будет принимать решения, такие как разворачивание циклов или встроенные функции. Компилятор по-прежнему может игнорировать встроенный оператор.
на современном компиляторе, вероятно, нет большой разницы. Он может быть встроен без
inline
и возможно не подставляться С theinline
.
из Википедии: Inline function-это функция, при которой компилятору было предложено выполнить встроенное расширение. Другими словами, программист запросил, чтобы компилятор вставлял полное тело функции в каждое место, где вызывается функция, а не генерировал код для вызова функции в одном месте, которое она определена. Компиляторы не обязаны выполнять этот запрос.
встроенная функция, если компилятор соответствует, будет включать встроенную функцию в код, в котором она была вызвана, как если бы ни одна функция не была вызвана (как если бы вы поместили логику в вызывающую функцию) и избежать накладных расходов на вызов функции.
inline
хорошо работает с понятием процедурная абстракция:inline double square (double x) { return x*x;} int squareTwice(double x) { double first = square(x); double second = square(x); return first * second; }
вышесказанное принципиально похоже на следующее:
int squareTwice(double x) { double first = x*x; double second = x*x; return first * second; }
это происходит потому, что когда компилятор inline-разворачивает вызов функции, код функции вставляется в поток кода вызывающего объекта; поэтому может быть проще процедурно абстрагировать второй пример к первому примеру.
процедурная абстракция позволяет разбить a подпрограмма в меньшие подпрограммы, которые гораздо легче читать (хотя это может быть выбор стиля).