Как я узнаю, действительно ли встроенная функция заменена в том месте, где она вызывается или нет?
Я знаю, что встроенная функция либо заменяется там, где она вызывается, либо ведет себя как нормальная функция.
Но как я узнаю, действительно ли встроенная функция заменена в том месте, где она вызывается или нет, как решение обработки встроенной функции, поскольку inline находится во время компиляции?
Ответы
Ответ 1
Программно во время выполнения, вы не можете.
И правда в том, что: Вам не нужно знать
Компилятор может выбрать inline
функции, которые не отмечены inline
, или игнорировать функции, помеченные явно inline
, это полностью желание (чтение мудрости) компилятора, и вы должны доверять компилятору, выполняющим свою работу разумно, Большинство компиляторов основного потока прекрасно справятся со своей работой.
Если ваш вопрос чисто с академической точки зрения, есть несколько вариантов:
Анализ сгенерированного кода сборки:
Вы можете проверить код сборки, чтобы проверить, встроен ли код функции в точке вызова.
Как сгенерировать код сборки?
Для gcc:
Используйте переключатель -S
во время компиляции.
Для примера:
g++ -S FileName.cpp
Сгенерированный ассемблерный код создается как файл FileName.s
.
Для MSVC:
Используйте /FA Switch из командной строки.
В сгенерированном запросе кода сборки, если есть инструкция сборки call
для конкретной функции.
Использовать специальные предупреждения и диагностику компилятора:
Некоторые компиляторы выдают предупреждение, если они не выполняют запрос встроенной функции.
Например, в gcc параметр команды -Winline
выдаст предупреждение, если компилятор не строит функцию, объявленную в строке.
Подробнее о
Ответ 2
Проверьте сгенерированный код. Если функция расширена, вы увидите ее тело, в отличие от call
или аналогичной инструкции.
Ответ 3
Вы можете использовать инструменты для перечисления символов из объектных файлов, таких как nm
в Linux. Если функция была встроена, она не будет отображаться в выводе nm
- она стала частью некоторой другой функции. Также вы не сможете поставить точку останова на эту функцию по имени в отладчике.
Ответ 4
С помощью gdb, если вы не можете вызвать функцию, одно из возможных значений этой функции - это встроенная функция. Перевернув рассуждения, если вы можете вызвать функцию внутри gdb, означает, что функция не помечена в строке.
Ответ 5
Если вам нужно убедиться, что функция включена и ОК, чтобы перейти с проприетарным расширением в MS VС++, проверить __forceinline
declarator, Компилятор будет либо встроить функцию, либо, если она попадет в список зарегистрированных случаев, вы получите предупреждение - так что вы узнаете статус вложения.
Никоим образом не одобряя его.
Ответ 6
Решение встроить или не выполнять функцию компилятором. И поскольку это сделано компилятором, поэтому ДА, его можно сделать только во время компиляции.
Итак, если вы видите код сборки с помощью опции -S (с gcc -S выдает код сборки), вы можете увидеть, была ли ваша функция встроенной или нет.
Ответ 7
- см. размер файлов объектов, они различаются между встроенными и не встроенными
- использовать nm "obj_file" | grep "fun_name", они также отличаются
- gcc -Winline -O1
- сравнить с кодом сборки