无码av一区二区三区无码,在线观看老湿视频福利,日韩经典三级片,成 人色 网 站 欧美大片在线观看

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

C++自制心得——類與對(duì)象(連續(xù)構(gòu)造優(yōu)化)

2023-09-12 19:04 作者:這年頭起名可真不容易  | 我要投稿

這是一個(gè)短篇專欄,不會(huì)花太長(zhǎng)時(shí)間。這一章講編譯器對(duì)連續(xù)構(gòu)造過程的優(yōu)化,了解即可。

1. 匿名對(duì)象的有名化

用const&引用接收匿名對(duì)象會(huì)使匿名對(duì)象擁有名字,生命周期延長(zhǎng),與有名對(duì)象相同。

之前沒講這個(gè),現(xiàn)在補(bǔ)上。

2. 優(yōu)化

這是今天的重點(diǎn)

首先,我們來分析下面的代碼

理論上調(diào)用第一個(gè)func函數(shù)需要經(jīng)過構(gòu)造+拷貝構(gòu)造,第二個(gè)func函數(shù)也是如此,但編譯器優(yōu)化后結(jié)果卻并非如此

只有第一個(gè)函數(shù)需要經(jīng)過構(gòu)造+拷貝構(gòu)造,第二個(gè)函數(shù)就沒有拷貝構(gòu)造,這是編譯器優(yōu)化后的結(jié)果,編譯器會(huì)優(yōu)化同一語(yǔ)句中的連續(xù)構(gòu)造+拷貝構(gòu)造過程

同理,對(duì)于第三個(gè)函數(shù)編譯器會(huì)使用1進(jìn)行直接構(gòu)造,而非構(gòu)造+拷貝構(gòu)造

這個(gè)也是優(yōu)化后的結(jié)果

當(dāng)然,這種行為不是C++標(biāo)準(zhǔn)行為,而是編譯器自行決定的結(jié)果,不過鑒于所有新一代編譯器均進(jìn)行類似的優(yōu)化操作,你還是把它當(dāng)成C++特性吧

如果編譯器沒有優(yōu)化,第一個(gè)函數(shù)調(diào)用會(huì)先構(gòu)造aa,用aa拷貝構(gòu)造臨時(shí)對(duì)象,析構(gòu)aa,用臨時(shí)對(duì)象拷貝構(gòu)造a1,析構(gòu)臨時(shí)對(duì)象

第二個(gè)函數(shù)會(huì)先構(gòu)造a2,再構(gòu)造aa,用aa拷貝構(gòu)造臨時(shí)對(duì)象,析構(gòu)aa,用臨時(shí)對(duì)象賦值a2,析構(gòu)臨時(shí)對(duì)象

兩者效率上的差異就是一次拷貝構(gòu)造與構(gòu)造+賦值重載的差別

但是編譯器優(yōu)化了第一個(gè)函數(shù)調(diào)用中產(chǎn)生的臨時(shí)對(duì)象,省掉了一次拷貝構(gòu)造+析構(gòu),整個(gè)調(diào)用過程就變成了這樣:構(gòu)造aa,直接用aa拷貝構(gòu)造a1,析構(gòu)aa

對(duì)于第二個(gè)函數(shù)調(diào)用編譯器就無法優(yōu)化,因?yàn)椴皇沁B續(xù)的構(gòu)造+拷貝構(gòu)造

這段代碼很有意思,如果編譯器不優(yōu)化,整個(gè)調(diào)用過程就會(huì)是構(gòu)造匿名對(duì)象,用匿名對(duì)象拷貝構(gòu)造臨時(shí)對(duì)象,析構(gòu)匿名對(duì)象,用臨時(shí)對(duì)象拷貝構(gòu)造a1,析構(gòu)臨時(shí)對(duì)象

編譯器優(yōu)化后就只剩一個(gè)構(gòu)造了,整個(gè)調(diào)用過程就變成了用缺省值直接構(gòu)造a1,省掉了所有中間步驟

同理,這么返回也是一個(gè)結(jié)果

綜上,建議各位在寫代碼時(shí)盡量采取上述方式節(jié)約構(gòu)造開銷

C++自制心得——類與對(duì)象(連續(xù)構(gòu)造優(yōu)化)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
普洱| 东阿县| 应城市| 沙洋县| 色达县| 寿光市| 多伦县| 孟津县| 洪雅县| 广平县| 广德县| 岚皋县| 安徽省| 松滋市| 龙胜| 达日县| 集贤县| 吉林市| 华容县| 肇庆市| 宝丰县| 侯马市| 曲沃县| 同德县| 汉源县| 灵宝市| 灵寿县| 稻城县| 洪泽县| 永州市| 尚志市| 德阳市| 鄂州市| 遵化市| 牟定县| 河源市| 九江县| 大石桥市| 邓州市| 泾川县| 扶沟县|