Подставляемые функции

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

5
задан Rajendra Uppal 5 March 2010 в 04:33
поделиться

6 ответов

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

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

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

10
ответ дан 18 December 2019 в 14:44
поделиться

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

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

2
ответ дан 18 December 2019 в 14:44
поделиться

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

1
ответ дан 18 December 2019 в 14:44
поделиться

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

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

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

0
ответ дан 18 December 2019 в 14:44
поделиться

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

0
ответ дан 18 December 2019 в 14:44
поделиться

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

Но вы можете увеличить вероятность того, что функция будет встроенной функцией,

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

0
ответ дан 18 December 2019 в 14:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: