色色一区二区三区,一本大道道久久九九AV综合,国产香蕉97碰碰视频va碰碰看,综合亚洲国产2020

    <legend id="mljv4"><u id="mljv4"><blockquote id="mljv4"></blockquote></u></legend>

    <sub id="mljv4"><ol id="mljv4"><abbr id="mljv4"></abbr></ol></sub>
      <mark id="mljv4"></mark>

      為什么&#x27;t GCC能為兩個(gè)int32的結(jié)構(gòu)生成一個(gè)最優(yōu)運(yùn)算符==?

      2021-02-19 11:51

      一位同事向我展示了我認(rèn)為不必要的代碼,但確實(shí)如此。我希望大多數(shù)編譯器都會(huì)把這三種平等測(cè)試的嘗試看作是e等效:#包括gt;#includegt;結(jié)構(gòu)點(diǎn){std::int32\u t

      解答動(dòng)態(tài)

      • (a.y^b.y))==0;} GCC和clang在按值傳遞結(jié)構(gòu)時(shí)都有相同的遺漏優(yōu)化(因此a在RDI中,b在RSI中,因?yàn)閤86-64 systemv的調(diào)用約定就是這樣將結(jié)構(gòu)打包到寄存器的):https://godbolt.org/z/v88a6s。memcpy/memcmp版本都編譯成cmp rdi,rsi/sete al,但是其他的操作是的32位操作。
        struct alignas(uint64\u t)Point在參數(shù)位于寄存器中的按值情況下仍然有幫助,優(yōu)化了GCC的兩個(gè)相同版本,但沒有優(yōu)化bithack XOR/OR。(https://godbolt.org/z/ofGa1f). 這能給我們一些關(guān)于GCC內(nèi)部的提示嗎?對(duì)齊對(duì)clang沒有幫助。

        • 如果您“修復(fù)”了對(duì)齊,那么所有這些都會(huì)給出相同的a(使用gcc):
          struct alignas(alignof(std::int64

          • t))Point{std::int32

            • t x,y;}; Demo

              • 為什么編譯器不能生成[與memcpy版本相同的程序集]?
                編譯器“可以”在允許的意義上。
                編譯器根本沒有。為什么沒有超出我的知識(shí)范圍,因?yàn)檫@需要深入了解優(yōu)化程序是如何實(shí)現(xiàn)的。但是,答案可能從“沒有覆蓋這種轉(zhuǎn)換的邏輯”到“規(guī)則沒有調(diào)整為假設(shè)一個(gè)輸出比另一個(gè)快”。
                如果使用Clang而不是GCC,您會(huì)注意到它為Equal和Equal1生成相同的輸出,并且程序集沒有跳轉(zhuǎn)。除了使用兩條32位指令代替一條64位指令外,它與“優(yōu)化”版本相同。此外,如Jarod42的答案所示,點(diǎn)的對(duì)齊對(duì)優(yōu)化者沒有影響。
                MSVC的行為就像叮當(dāng)聲,因?yàn)樗皇軐?duì)齊的影響,但不同的是,它沒有擺脫跳躍。
                就其價(jià)值而言,編譯器(我檢查了GCC和Clang)產(chǎn)生了與C++ 20默認(rèn)比較基本相同的輸出,因?yàn)樗鼈兪窍嗟鹊。不管出于什么原因,GCC選擇使用jne而不是je來進(jìn)行跳轉(zhuǎn)。
                這是一個(gè)缺少的編譯器優(yōu)化
                ,假設(shè)在目標(biāo)cpu上一個(gè)總是比另一個(gè)快,這是一個(gè)公平的結(jié)論。

                • End

                免責(zé)聲明:

                本頁(yè)內(nèi)容僅代表作者本人意見,若因此產(chǎn)生任何糾紛由作者本人負(fù)責(zé),概與琴島網(wǎng)公司無關(guān)。本頁(yè)內(nèi)容僅供參考,請(qǐng)您根據(jù)自身實(shí)際情況謹(jǐn)慎操作。尤其涉及您或第三方利益等事項(xiàng),請(qǐng)咨詢專業(yè)人士處理。