وقتی که تابع inline باشه کامپایلر مستقیم کد داخل تابع رو داخل main برنامه میزاره اگرتابع inline نباشه از call برای صدا زدن procedure استفاده میشه .
در تابعی که inline شده علاوه بر این که عملیات push و pop انجام نمیشه یک دلیل دیگه هم داره که سریع تر اجرا میشه وقتی دستور call داخل اسمبلی استفاده میشه cpu مجبور میشه که صبر کنه تا دستور اجرا بشه بعد بقیه دستورات رو اجرا کنه جالا اگر مثلا مقدار بازگشتی از تابع داخل یک دستور شرطی استفاده شده بود اگر call نباشه می تونه با استفاده از branch prediction بیاد نتیجه دستورات شرطی تابع رو پیش بینی کنه و قسمت های بعدی کد رو هم همزمان با تابع اجرا کنه که تاثیر خیلی زیادی داره(این پیش بینی cpu ها بیشتر از 98% اوقات درسته ) .
inline کردن توابع حجم برنامه رو هم زیاد می کنه پس کامپایلر فقط می تونه توابعی که طول کوتاهی دارن و دفعات زیادی هم استفاده نمیشن رو inline کنه چون اگر بخواد توابع بزرگتر رو inline کنه حجم کد تولیدی به شدت زیاد میشه .
مثلا این کد رو در نظر بگیرید :
#include <iostream>
int foo(int val)
{
if (val < 50)
return 1;
else
return 0;
}
int main()
{
int r = 0;
for (int i = 0; i < 100;i++){
r += foo(i);
}
if (r>10)
r -= 5;
std::cout << r;
}
کد زیر کد اسمبلی هستش که ویژوال استودیو در حالت releaseو تنظیمات مربوط به حداکثر سرعت تولید می کنه (البته این قسمت مرتبط بود چند هزار خط هم مربوط به cout بود که نزاشتم)
_TEXT SEGMENT
_main PROC ; COMDAT
; Line 12
xor edx, edx
; Line 13
xor eax, eax
$LL4@main:
; Line 5
xor ecx, ecx
cmp eax, 50 ; 00000032H
setl cl
; Line 13
inc eax
; Line 14
add edx, ecx
cmp eax, 100 ; 00000064H
jl SHORT $LL4@main
; Line 16
cmp edx, 10 ; 0000000aH
jle SHORT $LN1@main
; Line 17
sub edx, 5
$LN1@main:
; Line 18
mov ecx, DWORD PTR __imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A
push edx
call DWORD PTR __imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z
; Line 19
xor eax, eax
ret 0
_main ENDP
_TEXT ENDS
داخل کد بالا تابع foo چون کوتاه بوده با این که inline تعریف نشده
کامپایلر بصورت خودکار inline کرده و داخل main گداشته ( line5 تا line16 داخل کد اسمبلی) و چون این جا call نداریم cpu از branch prediction استفاده می کنه وif (r>10 رو هم همزمان decode می کنه .
ولی تابع cout چون پیجیده تر بوده inline نشده و از call برای صدا زدن استفاده شده .