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

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

C++vector擴(kuò)容解析noexcept的應(yīng)用場景有哪些-創(chuàng)新互聯(lián)

C++ vector擴(kuò)容解析noexcept的應(yīng)用場景有哪些?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。

超過10年行業(yè)經(jīng)驗,技術(shù)領(lǐng)先,服務(wù)至上的經(jīng)營模式,全靠網(wǎng)絡(luò)和口碑獲得客戶,為自己降低成本,也就是為客戶降低成本。到目前業(yè)務(wù)范圍包括了:網(wǎng)站制作、成都網(wǎng)站制作,成都網(wǎng)站推廣,成都網(wǎng)站優(yōu)化,整體網(wǎng)絡(luò)托管,微信小程序定制開發(fā),微信開發(fā),重慶APP軟件開發(fā),同時也可以讓客戶的網(wǎng)站和網(wǎng)絡(luò)營銷和我們一樣獲得訂單和生意!

c++11提供了關(guān)鍵字noexcept,用來指明某個函數(shù)無法——或不打算——拋出異常:

void foo() noexcept; // a function specified as will never throw
void foo2() noexcept(true); // same as foo
void bar(); // a function might throw exception
void bar2() noexcept(false); // same as bar

所以我們需要了解以下兩點:

noexcept有什么優(yōu)點,例如性能、可讀性等等。

需不需要在代碼中大量使用noexcept。

noexcept優(yōu)點

我們先從std::vector入手來看一下第一點。

我們知道,vector有自己的capacity,當(dāng)我們調(diào)用push_back但是vector容量滿時,vector會申請一片更大的空間給新容器,將容器內(nèi)原有的元素copy到新容器內(nèi):

C++ vector擴(kuò)容解析noexcept的應(yīng)用場景有哪些

但是如果在擴(kuò)容元素時出現(xiàn)異常怎么辦?

申請新空間時出現(xiàn)異常:舊vector還是保持原有狀態(tài),拋出的異常交由用戶自己處理。

copy元素時出現(xiàn)異常:所有已經(jīng)被copy的元素利用元素的析構(gòu)函數(shù)釋放,已經(jīng)分配的空間釋放掉,拋出的異常交由用戶自己處理。

這種擴(kuò)容方式比較完美,有異常時也會保持上游調(diào)用push_back時原有的狀態(tài)。

但是為什么說比較完美,因為這里擴(kuò)容還是copy的,當(dāng)vector內(nèi)是一個類且持有資源較多時,這會很耗時。所以c++11推出了一個新特性:move,它會將資源從舊元素中“偷”給新元素(對move不熟悉的同學(xué)可以自己查下資料,這里不展開說了)。應(yīng)用到vector擴(kuò)容的場景中:當(dāng)vector中的元素的移動拷貝構(gòu)造函數(shù)是noexcept時,vector就不會使用copy方式,而是使用move方式將舊容器的元素放到新容器中:

C++ vector擴(kuò)容解析noexcept的應(yīng)用場景有哪些

利用move的交換類資源所有權(quán)的特性,使用vector擴(kuò)容效率大大提高,但是當(dāng)發(fā)生異常時怎么辦:
原有容器的狀態(tài)已經(jīng)被破壞,有部分元素的資源已經(jīng)被偷走。若要恢復(fù)會極大增加代碼的復(fù)雜性和不可預(yù)測性。所以只有當(dāng)vector中元素的move constructor是noexcept時,vector擴(kuò)容才會采取move方式來提高性能。

剛才總結(jié)了利用noexcept如何提高vector擴(kuò)容。實際上,noexcept還大量應(yīng)用在swap函數(shù)和move assignment中,原理都是一樣的。

noexcept使用場景

上面提到了noexcept可以使用的場景:

  • move constructor
  • move assignment
  • swap
     

很多人的第一念頭可能是:我的函數(shù)現(xiàn)在看起來明顯不會拋異常,又說聲明noexcept編譯器可以生成更高效的代碼,那能加就加唄。但是事實是這樣嗎?

這個問題想要討論清楚,我們首先需要知道以下幾點:

函數(shù)自己不拋異常,但是不代表它們內(nèi)部的調(diào)用不會拋出異常,并且編譯器不會提供調(diào)用者與被調(diào)用者的noexcept一致性檢查,例如下述代碼是合法的:

void g(){
  ...    //some code
}
void f() noexcept
{
  … 			//some code
  g();
}

分享標(biāo)題:C++vector擴(kuò)容解析noexcept的應(yīng)用場景有哪些-創(chuàng)新互聯(lián)
當(dāng)前URL:http://weahome.cn/article/ijssd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部