跟我學(xué)c++中級篇——zerooverheadabstraction-創(chuàng)新互聯(lián)

一、零成本抽象(zero overhead abstraction)

什么是零成本抽象?這東西不是國人提出的,那就得用人家提出的人的解釋:“What you don’t use, you don’t pay for. And further: What you do use, you couldn’t hand code any better.”。這句話什么意思呢?不會為不用的東西付出代價(jià),也就是說,你用到的東西,無法(在不付出代價(jià)的情況)做得更好。這句話有點(diǎn)別扭啊。
可以這樣理解,在開發(fā)過程中,僅僅通過設(shè)計(jì)就可以達(dá)到最佳的性能。更形象的一點(diǎn)比喻就是,不通過技術(shù)創(chuàng)新(這玩意得付出成本),僅通過工程方法進(jìn)行組合調(diào)度,實(shí)現(xiàn)更優(yōu)的性能。這個(gè)是不是有點(diǎn)越解釋越糊涂的意思,大家自己慢慢領(lǐng)悟吧。

創(chuàng)新互聯(lián)從2013年開始,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢想脫穎而出為使命,1280元廈門做網(wǎng)站,已為上家服務(wù),為廈門各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792二、意義

零成本抽象,zero overhead abstraction,主要有三點(diǎn)意義:
1、不增加整體開銷
這也是在定義中提到的,不能為實(shí)現(xiàn)或者達(dá)到某種效果,需要這個(gè)庫那個(gè)庫,需要增加依賴或者其它成本。如果這樣做,就不叫零成本。
2、其代碼達(dá)到一定程度的最佳
如果抽象無法達(dá)到最佳,抽象的意義何在。所以說,一定是在某種程度上達(dá)到了一種基本無法用常用的方法進(jìn)行優(yōu)化的結(jié)果。
3、提升開發(fā)設(shè)計(jì)的整體體驗(yàn)
這個(gè)比較難纏,就象人的飲食,蘿卜白菜各有所愛。設(shè)計(jì)開發(fā)體驗(yàn)也是如此,但從主流上看,應(yīng)該是大多數(shù)感到了更好的抽象的體驗(yàn)。

三、說明

在c++中,零成本抽象其實(shí)都隱藏在一些細(xì)節(jié)中,其實(shí)有很多的技術(shù),用不好就達(dá)不到零成本抽象,用得好,就是零成本抽象。有的技術(shù)在編譯器不斷發(fā)展的過程中,自動會對其進(jìn)行優(yōu)化,即在背后默默的為開發(fā)者實(shí)現(xiàn)了零成本抽象。但c++的優(yōu)勢不在于編譯器優(yōu)化,而是在于可以使用代碼手動優(yōu)化,這才是重點(diǎn)。
舉一個(gè)最簡單的例子,初始化,看下面的例子:

#includeclass A
{
public:
    A() { std::cout<< "call A"<< std::endl; }
};
class B
{
public:
    B() { std::cout<< "call B"<< std::endl; }
};
class Data
{
public:
    Data(A a,B b):a_(a),b_(b)//a_(std::move(a)),b_(std::move(b))
    {
    }

private:
    A a_;
    B b_;
};

int main()
{
    A a;
    B b;
    Data(a,b);
}

看這個(gè)代碼,其實(shí)就有兩個(gè)方面需要分析,第一,如果A和B是兩個(gè)平凡的類(結(jié)構(gòu)體),那么,這個(gè)編譯器一般優(yōu)化不會有太大的問題;但是,第二,就是如果這兩個(gè)類是非平凡的,或者傳入的對象是臨時(shí)對象,這事就比較麻煩了,會拷貝至少兩次。所以最好還是用注釋的方式,移動構(gòu)造,這就方便多了。
其實(shí)在c++中這種現(xiàn)象非常多,析構(gòu)函數(shù)也有類似的情況:

class Data
{
public:
    Data(A a,B b):a_(a),b_(b) 
    {
    }
~Data(){}
//~Data=default;

public:
    int a_;
    int b_;
};

這兩者一個(gè)使用自定義的一個(gè)析構(gòu)函數(shù),一個(gè)是使用默認(rèn)的析構(gòu)函數(shù),后者就比前者要效率高。
再舉一個(gè)常見的例子,比如開發(fā)者都知道,對于一個(gè)反復(fù)使用對象的工作,如果反復(fù)不斷的分配對象,分配和析構(gòu)都需要耗費(fèi)大量的時(shí)間(前提是用得非常頻繁),這時(shí),可以通過設(shè)計(jì)引入池化技術(shù),就可以解決類似問題。其它比如for循環(huán)vector里的string優(yōu)化,可以使用const &的方式(這種方式在發(fā)生隱式轉(zhuǎn)換時(shí)無效,仍然會造成復(fù)制,比如unordered_map 用pair遍歷,解決的方式是使用auto&或結(jié)構(gòu)化綁定)。這種很常見,大家可能都不怎么注意,其實(shí)你寫的多了,就會發(fā)現(xiàn)存在非常多的這種代碼,不過有些比較老的,就不一定了。

四、總結(jié)

C++基本保證了零成本抽象(虛表就無法保證, C++設(shè)計(jì)中,有2個(gè)語言特性是不遵守零開銷原則的,運(yùn)行時(shí)類型識別(RTTI)和異常),它的意思就是說沒有使用到的特性不會產(chǎn)生開銷。怎么理解這句話呢?你不會模板照樣進(jìn)行c++編程。你不會模板元編程,照樣進(jìn)行模板編程。一些所謂的必須用到的技術(shù),c++的編譯器會在編譯時(shí)對其進(jìn)行處理,而無須手動干預(yù)。像模板技術(shù),很多甚至在編譯期就搞定了。在這方面其實(shí)Rust做的比c++要好,比如借用和所有權(quán),這個(gè)就是單純設(shè)計(jì)上搞的,非常好。
做技術(shù)就是這樣,其實(shí)想達(dá)到真正的zero overhead abstraction,其實(shí)是一個(gè)不可能三角。但是,不可能也要朝著優(yōu)化不斷的前進(jìn),不可能因?yàn)橛袉栴}就不去改進(jìn),也許在不斷的改進(jìn)過程中,就會有新的突破。

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

網(wǎng)站名稱:跟我學(xué)c++中級篇——zerooverheadabstraction-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://muchs.cn/article8/cdegop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營銷、電子商務(wù)網(wǎng)站設(shè)計(jì)公司、建站公司企業(yè)建站、小程序開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名