真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

深入使用noexcept-創(chuàng)新互聯(lián)

深入使用noexcept
    • 簡(jiǎn)介
      • 好處
      • 壞處
    • 適用場(chǎng)景
    • 不適用場(chǎng)景
    • 實(shí)驗(yàn)結(jié)果
    • 總結(jié)
    • 參考資料

作為一家“創(chuàng)意+整合+營(yíng)銷”的成都網(wǎng)站建設(shè)機(jī)構(gòu),我們?cè)跇I(yè)內(nèi)良好的客戶口碑。成都創(chuàng)新互聯(lián)公司提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、成都網(wǎng)站建設(shè)、創(chuàng)意表現(xiàn)、網(wǎng)頁(yè)制作、系統(tǒng)開(kāi)發(fā)以及后續(xù)網(wǎng)站營(yíng)銷運(yùn)營(yíng)等一系列服務(wù),幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營(yíng)模式與有效的網(wǎng)絡(luò)營(yíng)銷方法,創(chuàng)造更大的價(jià)值。簡(jiǎn)介

noexcept是C++11引入的,表明函數(shù)是否會(huì)拋出異常。正確使用它可以優(yōu)化性能,錯(cuò)誤使用則會(huì)帶來(lái)麻煩。

noexcept使用語(yǔ)法有兩種:

  1. noexcpet
  2. noexcept(expression)

第二種使用方式允許用表達(dá)式?jīng)Q定是否noexcept起效果,當(dāng)expression的值為true的時(shí)候起效果,否則不起效。expression是編譯時(shí)求值,一切都是在編譯時(shí)決定。

好處

如果一個(gè)函數(shù)標(biāo)注成noexcept,

  • 可以選擇移動(dòng)構(gòu)造函數(shù) / 移動(dòng)賦值運(yùn)算符;
  • 編譯器就不用生成異常處理代碼了,因此可以優(yōu)化編譯。
壞處

如果noexcept的函數(shù)執(zhí)行時(shí)出了異常,包括所調(diào)用的函數(shù)拋出的異常,程序會(huì)馬上terminate,即使套上try...catch也仍舊會(huì)terminate。并且編譯器不會(huì)幫你檢查這樣的風(fēng)險(xiǎn)。

適用場(chǎng)景

在需要決定是調(diào)用移動(dòng)構(gòu)造函數(shù)(或者移動(dòng)賦值運(yùn)算符)還是復(fù)制構(gòu)造函數(shù)(或者復(fù)制賦值運(yùn)算符)時(shí),noexcept會(huì)影響決定。因?yàn)橐苿?dòng)語(yǔ)法會(huì)“破壞”原來(lái)的源對(duì)象的內(nèi)容,造成無(wú)法在出現(xiàn)異常情況下恢復(fù)狀態(tài)。因此只有移動(dòng)構(gòu)造函數(shù)(或者移動(dòng)賦值運(yùn)算符)標(biāo)明為noexcept時(shí),才能在這種情況下使用移動(dòng)構(gòu)造函數(shù)(或者移動(dòng)賦值運(yùn)算符)替代復(fù)制構(gòu)造函數(shù)(或者復(fù)制賦值運(yùn)算符)。

一個(gè)例子就是STL庫(kù)中的vector的擴(kuò)容,擴(kuò)容涉及到是復(fù)制對(duì)象還是移動(dòng)對(duì)象的問(wèn)題,就是上述的問(wèn)題。當(dāng)對(duì)象的移動(dòng)構(gòu)造函數(shù)可能會(huì)拋出異常的時(shí)候,vector是”不敢“在這個(gè)場(chǎng)景下調(diào)用的,因?yàn)槌隽水惓o(wú)法原恢復(fù)狀態(tài)。

詳細(xì)邏輯如下:

  1. 當(dāng)使用復(fù)制構(gòu)造時(shí),拋出異常時(shí)只要把已復(fù)制的對(duì)象銷毀,新分配的內(nèi)存釋放,一切還能恢復(fù)到跟以前一樣;
  2. 當(dāng)使用移動(dòng)構(gòu)造時(shí),容器中的原來(lái)的元素的狀態(tài)已經(jīng)被移動(dòng)構(gòu)造破壞了,無(wú)法恢復(fù)到跟以前一樣。

以下是測(cè)驗(yàn)代碼:

class A {
public:
    A() { std::cout<< "constructor"<< std::endl; }
    A(const A& a) { std::cout<< "copy constructor"<< std::endl; }
    A(const A&& a) noexcept { std::cout<< "move constructor"<< std::endl; } // 有noconcept時(shí),擴(kuò)容時(shí)用移動(dòng)構(gòu)造
    // A(const A&& a) { std::cout<< "move constructor"<< std::endl; }  // 去掉noconcept時(shí),擴(kuò)容時(shí)用拷貝構(gòu)造
};

int main() {
    std::vector v;
    v.reserve(1);
    for (int i = 0; i< 10; i++) {
        A a; // 構(gòu)造一個(gè)A類的實(shí)例。
        v.push_back(a); // 添加進(jìn)容器時(shí)會(huì)調(diào)用一次復(fù)制構(gòu)造,如果容量不夠則會(huì)擴(kuò)容,這時(shí)候會(huì)選擇復(fù)制構(gòu)造還是移動(dòng)構(gòu)造。
    }

    return 0;
}
不適用場(chǎng)景

其他情況均不太適合使用。因?yàn)椋?/p>

  1. 編譯器不會(huì)幫你做檢查,假如一個(gè)標(biāo)注noexcept的函數(shù)調(diào)用未標(biāo)注noexcept的函數(shù),是可以順利編譯的。但是未標(biāo)注nonexcept的函數(shù)是不保證不拋異常的。
  2. 一個(gè)函數(shù)加上noexcept之后就可能很難移除,因?yàn)槠渌a可能會(huì)直接或間接引用到它,且假設(shè)不會(huì)有異常;
  3. 如果一個(gè)標(biāo)注了noexcept的函數(shù)自己或者調(diào)用的函數(shù)(直接或間接)拋出異常,直接終止,非常簡(jiǎn)單粗暴。

因此出了幾個(gè)有限的適用場(chǎng)景外,其他情況下不要用noexcept

實(shí)驗(yàn)結(jié)果

以下圖表是來(lái)自于 C++ noexcept and move constructors effect on performance in STL Containers — TRYING TO FIND THE OBVIOUS (hlsl.co.uk) 這篇博客的實(shí)驗(yàn)結(jié)果。
在這里插入圖片描述
根據(jù)實(shí)驗(yàn)結(jié)果,性能提升了兩倍!

總結(jié)

雖然noexcept會(huì)在某些情況下提升性能,但是由于它的危險(xiǎn)性,包括發(fā)生異常直接終止程序且編譯器不會(huì)幫你檢查,除了以下情況下都不建議使用。

  1. 移動(dòng)構(gòu)造函數(shù)
  2. 移動(dòng)賦值運(yùn)算符
  3. 析構(gòu)函數(shù)
  4. 簡(jiǎn)單函數(shù)

1、2 已經(jīng)在前面說(shuō)過(guò)了,不再贅述。對(duì)于3、4,析構(gòu)函數(shù)本身不應(yīng)該拋異常,簡(jiǎn)單函數(shù)一般不會(huì)發(fā)生異常,因此可以放心標(biāo)注noexcept。

參考資料
  1. c++ 從vector擴(kuò)容看noexcept應(yīng)用場(chǎng)景 - 知乎 (zhihu.com)

  2. C++ noexcept and move constructors effect on performance in STL Containers — TRYING TO FIND THE OBVIOUS (hlsl.co.uk)

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


分享名稱:深入使用noexcept-創(chuàng)新互聯(lián)
文章源于:http://weahome.cn/article/icojd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部