C++的內(nèi)聯(lián)函數(shù)你了解嗎
1.概念
以inline修飾的函數(shù)叫做內(nèi)聯(lián)函數(shù),編譯時(shí)C++編譯器會(huì)在調(diào)用內(nèi)聯(lián)函數(shù)的地方展開,沒有函數(shù)壓棧的開銷,內(nèi)聯(lián)函數(shù)提升程序運(yùn)行的效率。
2.函數(shù)演示
我們先來看一下普通的函數(shù):
#include <iostream> using namespace std; int Add(int left, int right) { return left + right; } int main() { Add(1, 2); return 0; }
在匯編代碼我們可以看出函數(shù)調(diào)用和壓棧:
我們?cè)诩觟nline 試試看:
#include <iostream> using namespace std; inline int Add(int left, int right) { return left + right; } int main() { Add(1, 2); return 0; }
反匯編:
發(fā)現(xiàn)還是一樣,為什么呢?
在debug版本下編譯器不會(huì)將內(nèi)聯(lián)函數(shù)展開,因?yàn)檎归_就調(diào)試不了.
我們需要設(shè)置一下屬性:(vs2019)
首先我們打開屬性面板:
接下來進(jìn)行調(diào)試:
沒有函數(shù)的調(diào)用!!
反匯編:
3.函數(shù)特性
1.inline是一種以空間換時(shí)間的做法,省去調(diào)用函數(shù)額開銷。所以代碼很長(zhǎng)或者有循環(huán)/遞歸的函數(shù)不適宜使用作為內(nèi)聯(lián)函數(shù)。
2.inline對(duì)于編譯器而言只是一個(gè)建議,編譯器會(huì)自動(dòng)優(yōu)化,如果定義為inline的函數(shù)體內(nèi)有循環(huán)/遞歸等等,編譯器優(yōu)化時(shí)會(huì)忽略掉內(nèi)聯(lián)。
3. inline不建議聲明和定義分離,分離會(huì)導(dǎo)致鏈接錯(cuò)誤。因?yàn)閕nline被展開,就沒有函數(shù)地址了,鏈接就會(huì)找不到。
4.可以代替宏定義函數(shù).
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C/C++函數(shù)調(diào)用棧的實(shí)現(xiàn)方法
這篇文章主要介紹了C/C++函數(shù)調(diào)用棧的實(shí)現(xiàn)方法,可實(shí)現(xiàn)一個(gè)簡(jiǎn)單的腳本解釋器,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-10-10C語言循環(huán)隊(duì)列的表示與實(shí)現(xiàn)實(shí)例詳解
這篇文章主要介紹了C語言循環(huán)隊(duì)列的表示與實(shí)現(xiàn),對(duì)于數(shù)據(jù)結(jié)構(gòu)與算法的研究很有幫助,需要的朋友可以參考下2014-07-07Qt基礎(chǔ)開發(fā)之QString與QByteArray詳細(xì)用法與區(qū)別及QString QByteArray互轉(zhuǎn)
這篇文章主要介紹了Qt基礎(chǔ)開發(fā)之QString與QByteArray詳細(xì)用法與區(qū)別及QString QByteArray互轉(zhuǎn),需要的朋友可以參考下2020-03-03C語言的數(shù)據(jù)結(jié)構(gòu)之樹、森連、二叉樹之間的轉(zhuǎn)換圖解
這篇文章主要介紹了C語言的數(shù)據(jù)結(jié)構(gòu)之樹、森連、二叉樹之間的轉(zhuǎn)換詳解,數(shù)據(jù)是信息的載體,是描述客觀事物屬性的數(shù)、字符以及所有能輸入到計(jì)算機(jī)中并被程序識(shí)別和處理的符號(hào)的集合,需要的朋友可以參考下2023-07-07VS報(bào)錯(cuò)C6011的問題:取消對(duì)NULL指針的引用(解決方法)
這篇文章主要介紹了VS報(bào)錯(cuò)C6011的問題:取消對(duì)NULL指針的引用(解決方法),C6011:取消對(duì)NULL指針的引用,發(fā)現(xiàn)是沒有進(jìn)行空指針的判斷,解決方案跟隨小編一起看看吧2024-01-01