Встраивание функций - это оптимизация производительности, выполняемая компилятором
Для типичной функции, скомпилированной в машинный код, у вас будут прологи функций и Fepilogs. Пролог и эпилог настраивают фрейм стека, сохраняют регистры, выделяют место для локальных пользователей и делают все остальное, что необходимо в соответствии с соглашением о вызовах. Все это требует циклов процессора. Для действительно небольших функций (например, средств получения и установки свойств) эта стоимость может быть высокой по сравнению с фактической работой, выполняемой функцией. Именно здесь на помощь приходит встраивание :)
Встроенная функция - это функция, которую вы определили и которую компилятор решил включить непосредственно в методы, которые ее вызывают, вместо генерации call инструкций. Другими словами, фактический машинный код целевой встроенной функции «встроен» в тело вызывающего метода. Например, если Foo называется Bar и Bar был встроен, и вы запускали свою программу в отладчике, вы увидите инструкции для Bar в теле Foo. Эпилог и пролог для Bar можно отбросить.
В большинстве случаев вы должны просто позволить компилятору определять, когда встраивать функцию за вас. Встраивание не является волшебным или бесплатным. Это увеличивает размер кода и живые диапазоны переменных, а также заставляет компилятор манипулировать большим количеством данных с меньшим количеством местоположений. Из-за этого у компилятора есть сложный набор эвристик, чтобы определить, стоит ли это того. Большинство компиляторов позволяют встраивать подсказки. Для Visual Studio см. inline, __inline и __forceinline а>. Однако даже с этими подсказками компилятор может игнорировать вас и делать то, что он хочет.
Связанные концепции компилятора - это описание и частичное встраивание (см. здесь), которые пытаются переместить холодные, редко удаляемые блоки кода из тела большого метода, чтобы улучшить поведение кеша и даже подготовить почву для встраивания описанного метода.
person
Chris Schmich
schedule
24.08.2010