Как можно узнать, действительно ли компилятор использовал встраивание для inline-функций, а не обычный вызов при компиляции программы? Будет ли встроена функция большого размера, скажем, строк на 100?
Здравствуйте, Lone, Вы писали:
L>Как можно узнать, действительно ли компилятор использовал встраивание для inline-функций, а не обычный вызов при компиляции программы? Будет ли встроена функция большого размера, скажем, строк на 100?
Будет.
Не встраиваются функции содержащие циклы (for, while, do).
The insertion (called inline expansion or inlining) occurs only if the compiler's cost/benefit analysis show it to be profitable. Inline expansion alleviates the function-call overhead at the potential cost of larger code size.
...
The inline keyword tells the compiler that inline expansion is preferred. However, the compiler can create a separate instance of the function (instantiate) and create standard calling linkages instead of inserting the code inline. Two cases where this can happen are:
Recursive functions.
Functions that are referred to through a pointer elsewhere in the translation unit.
These reasons may interfere with inlining, as may others, at the discretion of the compiler; you should not depend on the inline specifier to cause a function to be inlined.
Из чего можно сделать вывод, что в общем случае нельзя однозначно сказать, будет ли фактически встроена та или иная функция — окончательное решение принимает компилятор на основании некоторого эвристического анализа. Но можно ли как-нибудь узнать уже после компиляции, для каких встроенных функций было выполнено inline-расширение, а для каких нет?
Я так понимаю, что это вопрос больше относится к конкретным реализациям компиляторов, а не собственно к языку С++. Например, для MS VC++:
If the compiler cannot inline a function declared with __forceinline, it generates a level 1 warning (4714).
А как насчет функций, объявленных с ключевым словом inline?
Здравствуйте, vadim77, Вы писали:
L>>А как насчет функций, объявленных с ключевым словом inline? V>А почему бы просто под "дебаггером" не посмотреть ассемблерный код, интересуещей тебя функции?
Здравствуйте, Lone, Вы писали:
L>Как можно узнать, действительно ли компилятор использовал встраивание для inline-функций, а не обычный вызов при компиляции программы?
GCC с ключем -Winline показывает все функции, которые не удалось встроить,
кроме того есть другие полезные ключи типа -finline-limit=n и прочие.
В Intel/Visual можно включить генерацию асмового листинга и смотреть.
L>Будет ли встроена функция большого размера, скажем, строк на 100?
О, это зависит от положения звезд на небе
Здравствуйте, Atilla, Вы писали:
A>Здравствуйте, vadim77, Вы писали:
L>>>А как насчет функций, объявленных с ключевым словом inline? V>>А почему бы просто под "дебаггером" не посмотреть ассемблерный код, интересуещей тебя функции?
A>или ключиком /D inline=__forceinline
Интересно, в этом случае будет форсироваться подстановка всех функций
определенных полностью в классе? (т.е. те которые неявно inline)
L>А как насчет функций, объявленных с ключевым словом inline?
А для таких функций есть свое предупреждение:
Compiler Warning (level 4) C4710
'function' : function not inlined
The given function was selected for inline expansion, but the compiler did not perform the inlining.
...
Сам ответил Мог бы и не задавать, если бы сразу хорошенько поискал