MDK C++中对内联的极度优化
先來看看我們SmartIRQ的具體實(shí)現(xiàn)
// 智能IRQ,初始化時(shí)備份,銷毀時(shí)還原 class SmartIRQ { public:force_inline SmartIRQ(bool enable = false){_state = __get_PRIMASK();if(enable)__enable_irq();else__disable_irq();}force_inline ~SmartIRQ(){__set_PRIMASK(_state);}private:uint _state; };在構(gòu)造的時(shí)候備份,然后根據(jù)參數(shù)決定打開還是關(guān)閉中斷。
在系統(tǒng)內(nèi)核時(shí)鐘里面,關(guān)鍵操作需要關(guān)閉中斷,最后打開,以免其它中斷影響關(guān)鍵操作的原子事務(wù)性。
于是我們有:
其中irq在離開作用域時(shí)被釋放,自動(dòng)調(diào)用SmartIRQ的析構(gòu)函數(shù),還原了中斷狀態(tài)
因?yàn)檎{(diào)用極其頻繁,最高可能1us調(diào)用一次該函數(shù),于是我們給SmartIRQ的構(gòu)造和析構(gòu)都加了force_inline強(qiáng)制使用內(nèi)聯(lián)。
總所周知,C++的內(nèi)聯(lián)其實(shí)就是以空間換時(shí)間,把一個(gè)函數(shù)的代碼全部搬出來直接使用,省去了調(diào)用、壓棧、彈棧、返回等操作。
SmartIRQ的析構(gòu)函數(shù)就罷了,但是構(gòu)造函數(shù)代碼量還是有好幾行的。
懷著試一試的心態(tài)調(diào)試該函數(shù),直接觀察匯編代碼:
MDK C++編譯器優(yōu)化到了極度變態(tài)的地步!
不僅僅內(nèi)聯(lián)了,SmartIRQ里面有兩個(gè)分支語句,直接被他省略了其中一個(gè),因?yàn)閰?shù)true已經(jīng)確定。
更加變態(tài)的是,本來采用SmartIRQ內(nèi)部私有成員_state保存狀態(tài),析構(gòu)時(shí)恢復(fù)的,它直接把這個(gè)狀態(tài)保存到寄存器r2里面去,連_state的內(nèi)存都給省了。
?
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的MDK C++中对内联的极度优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序简单入门1
- 下一篇: Linux sudoers文件的写法