Встроенные функции
Я знаю, что компилятор может выполнять или не выполнять встроенное расширение функции, независимо от того, запрошено ли это программистом или нет.
Мне было просто любопытно узнать, есть ли способ, с помощью которого программист может точно знать, что компилятор встроил определенную функцию?
6 ответов
Кроме просмотра сгенерированного кода, нет. Некоторые реализации могут предоставлять эту информацию, но это не требуется стандартом.
Вещи как inline
или же register
(дрожь) - это предложения для компилятора, и он может принять их, проигнорировать их или даже солгать вам, что он сделал это, тайно идя за вашей спиной и не делая этого:-)
Я склонен не использовать подобные функции, так как подозреваю, что компилятор часто знает лучше, чем я, как выжать из моего кода наибольшую производительность.
Вы можете профилировать свой код и посмотреть, появляется ли интересующая функция в стеке вызовов. Хотя, я полагаю, нет никакой гарантии, что частота выборки в вашем стеке недостаточно высока.
Но это может доказать, что это встроено: если вы знаете, A
звонки B
, который вызывает C
, а также A
никогда не звонит C
напрямую, если вы видите A
призвание C
в стеке вызовов, вы знаете, B
был предназначен для этого звонка.
Установите свой компилятор для генерации ассемблерного кода и проверьте там.
Я не думаю, что есть способ узнать, что вы хотите,
Но вы можете увеличить возможности функции как встроенной функции,
Делать определение функции видимым для единицы перевода, в которой она вызывается. т.е. вы всегда должны помещать определение встроенной функции в заголовочный файл.
Нет никакого способа узнать, кроме как посмотреть на выходной ассемблер.
Компиляторы в наши дни "умны" и решают, какие функции встроить и в каких случаях.
Подобно ключевому слову register, компиляторы делают выбор в наши дни и действительно игнорируют ваши запросы.