第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

為什么優(yōu)化會(huì)破壞此功能?

為什么優(yōu)化會(huì)破壞此功能?

C++ C
料青山看我應(yīng)如是 2019-08-27 16:25:50
為什么優(yōu)化會(huì)破壞此功能?我們最近在大學(xué)里開了一個(gè)關(guān)于多種語(yǔ)言編程特色的講座。講師寫下了以下功能:inline u64 Swap_64(u64 x){     u64 tmp;     (*(u32*)&tmp)       = Swap_32(*(((u32*)&x)+1));     (*(((u32*)&tmp)+1)) = Swap_32(*(u32*) &x);     return tmp;}雖然我完全理解這在可讀性方面也是非常差的風(fēng)格,但他的主要觀點(diǎn)是這部分代碼在生產(chǎn)代碼中運(yùn)行良好,直到它們實(shí)現(xiàn)了高優(yōu)化級(jí)別。然后,代碼將什么都不做。他說,變量的所有賦值tmp都將由編譯器優(yōu)化。但為什么會(huì)這樣呢?我知道有些情況下變量需要聲明為volatile,這樣編譯器就不會(huì)觸及它們,即使他認(rèn)為它們永遠(yuǎn)不會(huì)被讀或?qū)懀也恢罏槭裁磿?huì)發(fā)生這種情況。
查看完整描述

3 回答

?
慕哥9229398

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超6個(gè)贊

在C ++中,如果指針參數(shù)char*指向基本上不同的類型(“嚴(yán)格別名”規(guī)則,則假定它們不是別名(除外)。這允許一些優(yōu)化。

在這里,u64 tmp永遠(yuǎn)不會(huì)被修改為u64
的內(nèi)容u32*被修改,而可以是無關(guān)的“ u64 tmp”這樣可以被看作nop用于u64 tmp

查看完整回答
反對(duì) 回復(fù) 2019-08-27
?
瀟湘沐

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超6個(gè)贊

g ++(Ubuntu / Linaro 4.8.1-10ubuntu9)4.8.1:

> g++ -Wall -std=c++11 -O0 -o sample sample.cpp> g++ -Wall -std=c++11 -O3 -o sample sample.cpp
sample.cpp: In function ‘uint64_t Swap_64(uint64_t)’:sample.cpp:10:19: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
     (*(uint32_t*)&tmp)       = Swap_32(*(((uint32_t*)&x)+1));
                   ^sample.cpp:11:54: warning: dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
     (*(((uint32_t*)&tmp)+1)) = Swap_32(*(uint32_t*) &x);
                                                      ^

Clang 3.4沒有在任何優(yōu)化級(jí)別發(fā)出警告,這很奇怪 ......


查看完整回答
反對(duì) 回復(fù) 2019-08-27
  • 3 回答
  • 0 關(guān)注
  • 485 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)