內聯對編譯器
⑴ 在c語言中內聯函數有什麼作用
1.內聯函數可減少cpu的系統開銷,並且程序的整體速度將加快,但當內聯函數很大時,會有相反的作用,因此一般比較小的函數才使用內聯函數.
2.有兩種內聯函數的聲明方法,一種是在函數前使用inline關見字,另一種是在類的內部定義函數的代碼,這樣的函數將自動轉換為內聯函數,而且沒必要將inline放在函數前面.
3.內聯是一種對編譯器的請求,下面這些情況會阻止編譯器服從這項請求.
如果函數中包含有循環,switch或goto語句,遞歸函數,含有static的函數.
由此可以看出,內聯函數和成員函數沒什麼區別,區別就在於怎樣加快函數的執行速度而已。
⑵ C++編譯器(Dev-C)是否會自動內聯函數 對於什麼樣的函數即使標記inline也會拒絕內聯
G++編譯器是否會自動進行內聯函數?
G++編譯器是很先進的,編譯的時候如果開啟優化,G++會代碼進行各種優化,如:對合適的函數進行內聯(即便是沒有添加inline關鍵字),對某些函數直接對其進行求值,除此之外G++編譯器還可以對代碼進行重排序 等等。編譯器比你更了解硬體,所以只要允許它優化,他會盡量進行優化。你使用的Dev C++集成開發環境使用的c++編譯器就是G++。
什麼樣的函數即使標記inline也無法內聯?
比如函數體太大、太復雜的話(比如包含多重循環、包含遞歸調用),對其進行內聯得不償失,這時編譯器就會忽略inline關鍵字,VC++編譯器提供了強制內聯函數的關鍵字,除非你非常了解硬體,不然最好讓編譯器來處。編譯不對那些函數進行內聯要看具體的編譯器實現了。
inline關鍵字的有哪些作用?
inline關鍵字可以提示編譯器對某個函數進行內聯,並且強制函數使用內部鏈接。比如說你在頭文件定義了某個函數,為了防止多重定義,你可以添加inline關鍵字來防止多重定義錯誤。
如果對硬體不是很了解,底層的代碼優化還是留給編譯器來處理。
看看下面的幾個編譯器優化函數的例子:
1.編譯器直接對函數求值:

解釋一下:
第一條和第二天指令分別將b和a的地址載入到寄存器rdx和rcx中
第三條指令將b的值載入到eax寄存器中
第四條指令將34存入b中
第五條指令將eax的值加1(eax保存了之前b的值)
第六條指令將eax的值存入a中
可以看出編譯器將函數的兩條語句換了位置,這種優化主要是優化代碼的執行速度,有的CPU內存讀寫操作的的開銷不一樣,所以重新排序一下某些代碼能夠提高程序執行速度。
⑶ C++內聯函數具體有什麼作用
內聯函數可減少cpu的系統開銷,並且程序的整體速度將加快,但當內聯函數很大時,會有相反的作用,因此一般比較小的函數才使用內聯函數。
內聯函數是C++的增強特性之一,用來降低程序的運行時間。當內聯函數收到編譯器的指示時,即可發生內聯:編譯器將使用函數的定義體來替代函數調用語句,這種替代行為發生在編譯階段而非程序運行階段。

值得注意的是,內聯函數僅僅是對編譯器的內聯建議,編譯器是否覺得採取你的建議取決於函數是否符合內聯的有利條件。如何函數體非常大,那麼編譯器將忽略函數的內聯聲明,而將內聯函數作為普通函數處理。
內聯函數具有一般函數的特性,它與一般函數所不同之處公在於函數調用的處理。一般函數進行調用時,要將程序執行權轉到被調用函數中,然後再返回到調用它的函數中;而內聯函數在調用時,是將調用表達式用內聯函數體來替換。在使用內聯函數時,應注意如下幾點:
1、類內定義的函數是內聯函數,類外定義的函數是非內聯函數(短函數可以定義在類內,長函數可以定義在類外)。
2、可以為類外定義的函數指定 inline 關鍵字,強行為內聯函數。
3、在內聯函數內不允許用循環語句和開關語句。
4、內聯函數的定義必須出現在內聯函數第一次被調用之前。
⑷ 內聯函數和成員函數的區別是什麼
內聯函數是指在調用衣櫃函數時,不把他當作調用而處理,而是把這個函數的代碼直接在調用他的函數里展開的形式,也可以理解為內聯函數就相當於一段代碼。不需要調用,效率就高些。成員函數是類中聲明的函數,屬於類。當然如果在類中定義的成員函數自動變為內聯函數。
