1、去年年底我聽見這樣一句話“將所有函數內聯,執行效率能夠更高,函數本不應該存在”,對於一個大學才接觸編程,大一看了一年動漫,大二看了一年小說,大三才開始拿起《C++程序設計》(狗都不願意吃的青春啊),畢業不到一年的小菜鳥我來說,這簡直是毀三觀的陳述,我認為他的話是錯誤的,但是說不出充分的原理,編碼也是如此,寫的代碼自己都有一種奇怪的感覺,那么它一定有問題或者存在更為合理優越的實現。
2、內聯函數的基本工作原理的將函數調用替換為函數實體,直觀上能①減去函數調用的開銷,但是這也可能導致代碼體積膨脹,所以成為內聯函數的要求有函數實體小這一說。(如果函數實體的匯編輸出,將比函數調用產生的匯編輸出還小,不用考慮了,內聯吧)
3、可能是因為上面的原因,我看過很多不管多復雜的類的構造函數、析構函數都是內聯的,如果這個類的繼承層次有一定深度、組件足夠多,那么我們就需要重新考慮了,這種情況是我們要盡量避免的。
4、目前的編譯器都會有優化的功能,而且一般的優化都是針對的連續代碼進行優化,②內聯函數能夠使編譯器對代碼進行更好的優化。(代碼優化我相信編譯器會比我們一般人做的好很多,所以當我們需要優化自己的代碼時,着重點應該在於算法、軟件結構等較高層次進行)
5、感覺上2->3->4,證明了1中的那句話,到目前為止內聯給我們到來的麻煩僅是代碼體積膨脹,編譯出來的執行程序中的text段比較大而已,請記住這一點。
6、大家都知道現在計算機的存儲結構,這里只考慮高速緩存到內存這一部分,從高到低,每一級的訪問時間近似以成千倍甚至更高的增加。
7、為提高高速緩存的利用率,計算機是將其分頁分段進行更為有效的管理的。
8、高速緩存的大小是很小的(對於我們運行的程序來說),所以我們的數據不可能都被裝載到高速緩存中,這就引出了一個命中率的問題。在不命中的時候,就需要向更為下層的存儲結構尋找索取目標數據,寶貴的時間也因此不斷大幅增加。
9、回到5,我們因為使用大量內聯是text增大,那么相應的能夠存活在高速緩存的內容比例也就相對的減小,命中率因此降低,因為存儲結構的問題,我們過度的使用內聯得到了相反的結果。
10、干啥都要有個度,越過這個度以后,我們往往會適得其反。