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