在csapp中對(duì)分支怎樣優(yōu)化以及為什么這樣優(yōu)化的原因有很詳細(xì)的描述栗菜,我這里就是當(dāng)一個(gè)搬運(yùn)工來說一說三目運(yùn)算符和switch語句。
要了解三目運(yùn)算符的加速原因首先要知道現(xiàn)代處理器的加速機(jī)制——流水線(cpu的工作由取指令客叉,翻譯指令夹攒,讀數(shù)據(jù)蝴蜓,運(yùn)算鞭缭,寫數(shù)據(jù),跳到下一條指令組成)
做流水線的主要原因就是cpu運(yùn)算太快了抛猖,從內(nèi)存讀數(shù)據(jù)的時(shí)候你不能讓cpu在那干等啊格侯,所以就需要并行,多個(gè)進(jìn)程一起跑财著,這個(gè)讀數(shù)據(jù)的時(shí)候讓那個(gè)進(jìn)程去使用cpu的運(yùn)算資源联四,總之就是不讓cpu閑著(圖只能大概說明一下,畫得不好瓢宦,等看完四五章再詳細(xì)說流水線)碎连。
而條件分支會(huì)打斷流水灰羽,這個(gè)很好理解驮履,因?yàn)槌绦蛟谶\(yùn)行到分支之前無法預(yù)測(cè)要進(jìn)哪一個(gè)分支,我無法讓每條線上都布滿像ABC…那樣明確的步驟廉嚼,三目運(yùn)算符恰好解決了這個(gè)問題玫镐,它將分支語句變成了明確的步驟,從而可以實(shí)現(xiàn)流水
但是三目運(yùn)算符的使用范圍十分有限怠噪,它只能做這種簡(jiǎn)單運(yùn)算的分支恐似,如果條件中有很多運(yùn)算的話它就搞不定了。
至于switch語句傍念,它就是通過一張?zhí)D(zhuǎn)表來實(shí)現(xiàn)直接跳轉(zhuǎn)到分支(與一堆if else if相比)
最后我覺得switch翻譯成匯編后蠻有意思的矫夷,所以我用一道題目再來說明一下
switch中變量的跳轉(zhuǎn)總是從0開始,而第二句匯編將x加2憋槐,所以說標(biāo)號(hào)最小是-2双藕,三四句說明-2再往前數(shù)六個(gè)數(shù)就直接跳出了(default包含所有不在case中的數(shù))考慮到case最小是-2故最大應(yīng)該是4,L2處是默認(rèn)case-1阳仔,所以語句內(nèi)的標(biāo)號(hào)是-2 0 1 2 3 4忧陪。(中文版147頁)
最后,以上內(nèi)容均搬運(yùn)自csapp近范,如有雷同…