все вызовы встроенной функции должны быть перекомпилированы? - PullRequest
2 голосов
/ 05 января 2012

Мне нужно знать, как эта штука работает?Под этим я подразумеваю «все вызовы встроенной функции должны быть перекомпилированы».Я читаю книгу, в которой говорится, что каждый раз, когда в нашей программе используется встроенная функция, компилятор перекомпилирует краткое определение функции и помещает копию этого скомпилированного короткого определения в ваш код.понять это вообще.Объяснение с примером, показывающим весь процесс, будет высоко оценено.Кроме того, не могли бы вы объяснить, как это повышает эффективность.

Большое спасибо.

Ответы [ 3 ]

3 голосов
/ 05 января 2012

Предположим, у вас есть этот код:

void foo() { bar(); }

int main()
{
   foo();
   foo();
   foo();
}

Если foo встроен, то компилятор по существу перепишет код следующим образом:

int main()
{
   bar();
   bar();
   bar();
}

Теперь, если вместо bar(); у вас был более сложный фрагмент кода, тогда этот фрагмент кода появлялся бы (и компилировался) три раза, а не один раз.

Вы платите за вызов функции за счет увеличенного и повторяющегося кода.

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

3 голосов
/ 05 января 2012

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

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

2 голосов
/ 05 января 2012

Из Википедии

http://en.wikipedia.org/wiki/Inline_function

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

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

...