Каково точное использование встроенных функций?

Возможное дублирование:
Преимущества встроенных функций в C ++?

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


person Naruto    schedule 24.08.2010    source источник


Ответы (3)


Определение C ++ FAQ Lite:

Когда компилятор встраивает вызов функции, код функции вставляется в поток кода вызывающей стороны (концептуально аналогично тому, что происходит с макросом #define).

Это может, в зависимости от множества других вещей, улучшить производительность, поскольку оптимизатор может процедурно интегрировать вызываемый код - оптимизировать вызываемый код в вызывающей стороне.

См. Ту же страницу для примеров и более подробной информации.

person Igor Oks    schedule 24.08.2010

Встраивание функций - это оптимизация производительности, выполняемая компилятором

Для типичной функции, скомпилированной в машинный код, у вас будут прологи функций и Fepilogs. Пролог и эпилог настраивают фрейм стека, сохраняют регистры, выделяют место для локальных пользователей и делают все остальное, что необходимо в соответствии с соглашением о вызовах. Все это требует циклов процессора. Для действительно небольших функций (например, средств получения и установки свойств) эта стоимость может быть высокой по сравнению с фактической работой, выполняемой функцией. Именно здесь на помощь приходит встраивание :)

Встроенная функция - это функция, которую вы определили и которую компилятор решил включить непосредственно в методы, которые ее вызывают, вместо генерации call инструкций. Другими словами, фактический машинный код целевой встроенной функции «встроен» в тело вызывающего метода. Например, если Foo называется Bar и Bar был встроен, и вы запускали свою программу в отладчике, вы увидите инструкции для Bar в теле Foo. Эпилог и пролог для Bar можно отбросить.

В большинстве случаев вы должны просто позволить компилятору определять, когда встраивать функцию за вас. Встраивание не является волшебным или бесплатным. Это увеличивает размер кода и живые диапазоны переменных, а также заставляет компилятор манипулировать большим количеством данных с меньшим количеством местоположений. Из-за этого у компилятора есть сложный набор эвристик, чтобы определить, стоит ли это того. Большинство компиляторов позволяют встраивать подсказки. Для Visual Studio см. inline, __inline и __forceinline . Однако даже с этими подсказками компилятор может игнорировать вас и делать то, что он хочет.

Связанные концепции компилятора - это описание и частичное встраивание (см. здесь), которые пытаются переместить холодные, редко удаляемые блоки кода из тела большого метода, чтобы улучшить поведение кеша и даже подготовить почву для встраивания описанного метода.

person Chris Schmich    schedule 24.08.2010
comment
Встраивание не обязательно приводит к раздуванию кода. Когда вызов встроен, компилятор может пропустить код для организации вызова, и поэтому встраивание может фактически сдуть код. - person sharptooth; 24.08.2010

http://www.parashift.com/c++-faq-lite/inline-functions.html

Даже если вы укажете флаг inline, компилятор может его проигнорировать. Если вы пишете библиотеку и действительно серьезно думаете о гарантиях производительности, которые вы хотите сделать (и чертовски профилировали это), то вы можете подумать о добавлении inline к своим функциям или методам. Даже в этом случае нет гарантии, что вы увидите какие-либо различия в скомпилированном коде, потому что компилятор, возможно, уже решил встроить их или проигнорировать ваш запрос.

Предупреждение о производительности: встраивание не всегда увеличивает вашу производительность, потому что оно также увеличивает размер вашего кода.

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

person Merlyn Morgan-Graham    schedule 24.08.2010