Подтвердить что ты не робот

Как я узнаю, действительно ли встроенная функция заменена в том месте, где она вызывается или нет?

Я знаю, что встроенная функция либо заменяется там, где она вызывается, либо ведет себя как нормальная функция.

Но как я узнаю, действительно ли встроенная функция заменена в том месте, где она вызывается или нет, как решение обработки встроенной функции, поскольку inline находится во время компиляции?

4b9b3361

Ответ 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
  • сравнить с кодом сборки