內聯函式 inline ,提高效率?

2021-08-21 02:35:33 字數 1301 閱讀 9963

①當函式體比較小的時候, 內聯該函式可以令目標**更加高效. 對於訪問函式以及其它函式體比較短, 效能關鍵的函式, 鼓勵使用內聯.

②乙個較為合理的經驗準則是, 不要內聯超過 10 行的函式. 謹慎對待析構函式, 析構函式往往比其表面看起來要更長, 因為有隱含的成員和基類析構函式被呼叫!

不一定!

因為函式呼叫是需要開銷的(函式呼叫時的引數壓棧、棧幀開闢與銷毀、以及暫存器儲存與恢復等等操作),如果說函式本身的**量比較小,比函式呼叫時做的準備工作的**還要小,那此時如果使用內聯的話,肯定比不使用內聯的**量還要小[2]。

不過如果函式的**量稍大,通常還是會增加**量的,因為內聯函式是在編譯階段被編譯器展開在呼叫處的,多次呼叫就需要多段重複的**放在各個呼叫處。對於非內聯函式,只需要儲存乙份函式體的**,然後進行呼叫就好了。所以,在空間上,一般來說使用內聯函式會導致生成的可執行檔案變大。

3、使用內聯函式後對於程式的效能會產生什麼影響?

首先,大家都知道現在計算機的儲存結構,這裡只考慮快取記憶體到記憶體這一部分,從高到低,每一級的訪問時間近似以成千倍甚至更高的增加。

其次,快取記憶體的大小是很小的(對於我們執行的程式來說),所以我們的資料不可能都被裝載到快取記憶體中,這就引出了乙個命中率的問題。在不命中的時候,就需要向更為下層的儲存結構尋找索取目標資料,寶貴的時間也因此不斷大幅增加。正如我們前面所說,內聯使用不當會導致編譯出來的執行程式中的text段比較大,那麼相應的能夠存活在快取記憶體的內容比例也就相對的減小,命中率因此降低,那就會導致程式的效能下降。即因為儲存結構的問題,我們過度的使用內聯得到了相反的結果[1]。

對於這一點,思考角度不同,能得到不同的結果。例如,我還可以這麼想:

由於內聯後呼叫函式體內需要執行的**是相鄰的,其執行的**都在同一 個頁面或連續的頁面中。如果沒有內聯,執行到被呼叫函式時,需要跳到包含被呼叫函式的記憶體頁面中執行,而被呼叫函式所屬的頁面極有可能當時不在物理記憶體 中。這意味著,內聯後可以降低「缺頁」的機率,知道減少「缺頁」次數的效果遠比減少一些**量執行的效果。另外即使被呼叫函式所在頁面可能也在記憶體中,但 是因為與呼叫函式在空間上相隔甚遠,所以可能會引起「cache miss」,從而降低執行速度。因此總的來說,內聯後程式的執行時間會比沒有內聯要少。即程式的速度更快,這也是因為內聯後**的空間 「locality」特性提高了[2]。

最後,反過來,內聯後,編譯器在做優化時,看到的是呼叫函式與被呼叫函式連成的一大塊**。即獲 得的**資訊更多,此時它對呼叫函式的優化可以做得更好。

參考:

[1] 內聯函式_為什麼能提高效率

[2] 內聯函式的優缺點

[3] c++ 內聯函式 (講解的tm真好)

如何提高效率

如果問 你想不想使自己的收入加倍 我猜每個人的答案都是 yes 如果我繼續問 你相不相信現在你的收入會加倍 我想有一些人可能會沒把握,有一些人認為不太可能,我告訴各位 你們每個人的收入一定會加 倍 因為按照每年物價增長率及通貨膨脹的正常速度,20年後你的收入一定會加倍。但是如果你希望,提前在5年內 ...

Python 提高效率

最近師兄給了小任務,算乙個p值。任務詳情是這樣的 第一步,有基因集a,23個元素,基因集b,451個元素,共有23 451 9922個組合 當然你要考慮去重 看在ppi資料庫 145萬多行資料 中出現的組合總個數 觀察值 第二步,然後再以hg19中基因為背景基因集,放回隨機抽取23個基因構成基因集c...

如何提高效率

在提高班學習有很長的一段時間了,學習的收穫中有一點是非常的明顯,那就是自己的效率明顯的比原來高出許多,現在就按照自己的切身體會來總結一下如何提高自己效率.1 目標 必須要有目標,沒有目標和方向效率會大大的折扣.當然不僅僅是學習,更是生活,事業,和人的整個一生.這點公尺老師非常的重視,每個學習階段都給...