2012-01-05 3 views
2

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

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

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

ответ

3

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

void foo() { bar(); } 

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

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

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

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

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

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

+0

Спасибо, Керек. Понял. удивительно. –

3

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

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

+0

Удивительный и просто объясненный. Спасибо Мартину. –

2

Материал из Википедии

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

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

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

+0

Спасибо Rajendran. Понял. –

Смежные вопросы