2010-03-05 7 views
5

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

+2

Более подходящий вопрос, есть ли способ, с помощью которого программист может точно знать, что компилятор ввел определенную функцию * call *? – Potatoswatter

ответ

10

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

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

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

0

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

1

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

+0

И если у вас есть разные флаги для сборки debug v release, обязательно используйте последнюю. Я видел некоторые компиляторы, которые никогда не встраиваются, если у вас есть хотя бы некоторая оптимизация. –

2

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

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

0

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

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

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

0

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

Но вы можете увеличить possibilites функции быть инлайн функция от,

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