• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-159  評(píng)論-223  文章-30  trackbacks-0
            周知內(nèi)聯(lián)是為了消除函數(shù)調(diào)用的代價(jià),即四大指令序列:調(diào)用前序列、被調(diào)者起始序列、被調(diào)者收尾序列、返回后序列。它們通常對(duì)應(yīng)到體系結(jié)構(gòu)調(diào)用者保存/恢復(fù)寄存器集合與被調(diào)者保存/恢復(fù)寄存器集合之約束。這個(gè)本質(zhì)也是內(nèi)聯(lián)的前提。試問(wèn)如果有某體系結(jié)構(gòu)比如S,它任意深度的函數(shù)調(diào)用代價(jià)幾乎為零,那么顯然內(nèi)聯(lián)是沒(méi)意義沒(méi)必要的。但是S可能存在嗎?我認(rèn)為不太可能。因?yàn)闄C(jī)器的資源比如寄存器集數(shù)量與堆棧空間是有限的,且調(diào)用需要知曉上下文,所以不能夠支持任意深度的調(diào)用,但是可以支持有限深度比如4層調(diào)用,這4層調(diào)用代價(jià)幾乎為零,假設(shè)再來(lái)一層,那么第5層調(diào)用代價(jià)就不為零了,這時(shí)如果內(nèi)聯(lián)第5層就變成4層調(diào)用,代價(jià)又幾乎為零。綜上所述,內(nèi)聯(lián)無(wú)論在何種體系結(jié)構(gòu),即使在一定深度內(nèi)沒(méi)意義也不會(huì)破壞性能。

            體系結(jié)構(gòu)直接影響程序性能。主要體現(xiàn)在指令集、寄存器、cache三塊。它們對(duì)于編譯器實(shí)現(xiàn)代碼優(yōu)化必須都考慮,尤其cache比如內(nèi)聯(lián)優(yōu)化、循環(huán)展開(kāi)、基本塊布局、函數(shù)重排,如果不是因?yàn)橛衏ache這玩意,內(nèi)聯(lián)優(yōu)化的復(fù)雜性會(huì)大為降低,因?yàn)椴挥每紤]代碼膨脹引起的副作用即cache缺失,只要評(píng)估函數(shù)的指令數(shù)與動(dòng)態(tài)執(zhí)行消耗的關(guān)系,指令數(shù)很少但執(zhí)行耗費(fèi)很多時(shí)鐘周期的,則不宜內(nèi)聯(lián),尤其函數(shù)為非葉子結(jié)點(diǎn);指令數(shù)很多但執(zhí)行耗費(fèi)較少的,則可僅內(nèi)聯(lián)其中的快速路徑代碼。因現(xiàn)實(shí)存在cache這玩意,就必須權(quán)衡代碼膨脹帶來(lái)的副作用,是否能接受一定的膨脹,需要精確評(píng)估,構(gòu)建函數(shù)調(diào)用頻率與其靜態(tài)調(diào)用位置的矩陣,計(jì)算收益比如平均執(zhí)行一次的耗時(shí)是否減少,若收益為正且明顯則可內(nèi)聯(lián),否則不宜內(nèi)聯(lián)。

            有些編譯器為了簡(jiǎn)單處理,不會(huì)內(nèi)聯(lián)帶靜態(tài)變量的函數(shù)哪怕指令數(shù)很少,或者內(nèi)聯(lián)不太正確比如LLVM(詳見(jiàn)下文)。其實(shí)單從技術(shù)上可以做到,不過(guò)要復(fù)雜些,復(fù)雜在于鏈接器的協(xié)作。為了保證函數(shù)級(jí)靜態(tài)變量的語(yǔ)義,編譯時(shí)要預(yù)留全局唯一標(biāo)志與構(gòu)造函數(shù)的占位符,在調(diào)用者體內(nèi)插入對(duì)全局唯一標(biāo)志的(位)判斷(標(biāo)志字的一位對(duì)應(yīng)一個(gè)靜態(tài)變量,表明是否已構(gòu)造或初始化賦值)、構(gòu)造函數(shù)調(diào)用/初始化賦值、置位標(biāo)志,而鏈接時(shí)要確定全局唯一標(biāo)志及構(gòu)造函數(shù)的地址。靜態(tài)變量、全局唯一標(biāo)志放于可執(zhí)行文件的數(shù)據(jù)區(qū),全局唯一構(gòu)造/初始化及析構(gòu)函數(shù)放于代碼區(qū),具體布局位置可以靈活,比如. data. static_obj,. text. obj. ctor/dtor。如果這種函數(shù)性能影響較大需要內(nèi)聯(lián)優(yōu)化,而編譯器不支持,有個(gè)替代的辦法是用全局變量或文件/類(lèi)級(jí)別的靜態(tài)變量,輔以對(duì)應(yīng)標(biāo)志處理一次性構(gòu)造或初始化賦值(必要時(shí)將這處理封裝為一個(gè)函數(shù)以確保目標(biāo)函數(shù)被內(nèi)聯(lián)),可達(dá)到同樣效果不足之處是作用域擴(kuò)大了。

            關(guān)于LLVM對(duì)于帶靜態(tài)變量的函數(shù)之內(nèi)聯(lián)的測(cè)驗(yàn)結(jié)果












            posted on 2023-11-16 23:32 春秋十二月 閱讀(252) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): Compiler
            久久久久亚洲AV成人网| 性做久久久久久免费观看| 精品久久人妻av中文字幕| 99精品久久精品一区二区| 精品人妻伦九区久久AAA片69| 久久国产精品免费一区| 国产亚洲美女精品久久久2020| 久久国产免费观看精品3| 久久国产精品一区| 久久综合久久自在自线精品自| 久久91这里精品国产2020| 漂亮人妻被黑人久久精品| 少妇被又大又粗又爽毛片久久黑人 | 亚洲国产精品成人久久| 777久久精品一区二区三区无码| 亚洲国产成人精品无码久久久久久综合 | 亚洲中文字幕伊人久久无码| 久久久久亚洲AV无码专区体验| 国产精品久久成人影院| 亚洲精品NV久久久久久久久久| 久久国产乱子伦精品免费强| 久久亚洲AV无码精品色午夜| 一级做a爱片久久毛片| 久久久久久九九99精品| 久久久久久曰本AV免费免费| 久久精品国产精品亚洲人人| 97久久超碰成人精品网站| 亚洲国产精品久久久天堂| 久久妇女高潮几次MBA| 亚洲精品乱码久久久久久蜜桃| 精品国产一区二区三区久久蜜臀| 久久精品国产清高在天天线| 无遮挡粉嫩小泬久久久久久久 | 国产2021久久精品| 韩国无遮挡三级久久| 99久久综合狠狠综合久久止| 久久人人妻人人爽人人爽| 欧美va久久久噜噜噜久久| 亚洲国产精品无码久久一线| 亚洲国产另类久久久精品黑人| 亚洲中文字幕无码久久精品1 |