Встроенные функции

Я знаю, что компилятор может выполнять или не выполнять встроенное расширение функции, независимо от того, запрошено ли это программистом или нет.
Мне было просто любопытно узнать, есть ли способ, с помощью которого программист может точно знать, что компилятор встроил определенную функцию?

6 ответов

Решение

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

Вещи как inline или же register (дрожь) - это предложения для компилятора, и он может принять их, проигнорировать их или даже солгать вам, что он сделал это, тайно идя за вашей спиной и не делая этого:-)

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

Вы можете профилировать свой код и посмотреть, появляется ли интересующая функция в стеке вызовов. Хотя, я полагаю, нет никакой гарантии, что частота выборки в вашем стеке недостаточно высока.

Но это может доказать, что это встроено: если вы знаете, A звонки B, который вызывает C, а также A никогда не звонит C напрямую, если вы видите A призвание C в стеке вызовов, вы знаете, B был предназначен для этого звонка.

Установите свой компилятор для генерации ассемблерного кода и проверьте там.

Я не думаю, что есть способ узнать, что вы хотите,

Но вы можете увеличить возможности функции как встроенной функции,

Делать определение функции видимым для единицы перевода, в которой она вызывается. т.е. вы всегда должны помещать определение встроенной функции в заголовочный файл.

Прочитайте разборку объектного файла.

Нет никакого способа узнать, кроме как посмотреть на выходной ассемблер.

Компиляторы в наши дни "умны" и решают, какие функции встроить и в каких случаях.

Подобно ключевому слову register, компиляторы делают выбор в наши дни и действительно игнорируют ваши запросы.

Другие вопросы по тегам