内联函数inline
結論在文章末尾處!
在C++中,為了解決一些頻繁調用的小函數大量消耗棧空間(棧內存)的問題,特別的引入了inline修飾符,表示為內聯函數。
內聯函數的處理方式是在函數的調用點直接代碼展開。在計算機系統下,假如頻繁的調用就會造成較大的時間開銷。內聯函數的引入減少了函數調用過程中開棧和清棧的開銷。
下面來看不使用內聯函數的時候:
#include<iostream>
using namespace std;int Add_int(int a, int b)
{return a + b;
}int main()
{int a = 10, b = 20;int c = Add_int(a,b);cout << "c" << "=" << c << endl;system("pause");return 0;
}
打開匯編:
?可以看到的是,先將b入棧,然后將a入棧,再通過call調用Add_int函數!
下面看一下使用內聯函數之后:
#include<iostream>
using namespace std;inline int Add_int(int a, int b) //在函數前面加上inline
{return a + b;
}int main()
{int a = 10, b = 20;int c = Add_int(a,b);cout << "c" << "=" << c << endl;system("pause");return 0;
}
打開她的匯編:
?我們打開匯編之后發現還是和之前沒加內聯函數inline之前的匯編是一樣的,這是怎么回事呢,原來我們加沒加inline都是處在debug版本下,inline在debug版本下是不生效的,只有在release 版本下inline才生效,那么我們切換到release版本下再來打開匯編:
?我們發現就沒有了入棧那些個操作,直接在調用函數那塊就將函數展開了!
那么內聯函數有什么需要注意的呢?
1.nline函數一般寫在頭文件中。(當多文件使用到同一個inline函數,就得寫在頭文件中)
2.inline函數只在Release版本生效。在Debug版本是不生效。
3.inline函數只是給編譯器的一個建議。具體是否處理成inline函數是編譯器決定的。
第三點具體是怎樣的呢,如果說你的內聯函數體內有循環、判斷語句這種的話,就算是你加了內聯函數inline,編譯器也不會按照內聯函數進行處理,還有就是當內聯函數函數體過大時也不會按照內聯函數進行處理,這個過大沒個具體值,可能是多于十行或是20行,對于某些編譯器來說,當你給有判斷語句與循環語句或函數體大的函數加inline之后,會進行報錯(看編譯器)!
還有以一個需要注意的點就是內聯函數與宏的區別:
????????inline函數的處理時機是在編譯階段處理的,有安全檢查和類型檢查。而宏的處理是在預編譯階段處理的,沒有任何檢查機制,只是簡單的文本替換。inline函數是一種更安全的宏。
總結
以上是生活随笔為你收集整理的内联函数inline的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ix35多少钱啊?
- 下一篇: 摩尔庄园手游花生怎么获得?