青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

huaxiazhihuo

 

非完美的stl

       C++類(lèi)庫(kù)開(kāi)發(fā)之難,舉世公認(rèn),最好的證據(jù)就是,1983年到現(xiàn)在,面世幾十年,就沒(méi)有一個(gè)正兒八經(jīng)的基礎(chǔ)類(lèi)庫(kù)。是啊,零懲罰,要高性能,要跨平臺(tái),要可擴(kuò)展,要人性化,又沒(méi)有垃圾回收的支持,又沒(méi)有運(yùn)行時(shí)類(lèi)型信息可用,……,這些方方面面的因素糾結(jié)在一起,就好像一個(gè)巨大的意大利面線(xiàn)團(tuán),真的是眾口難調(diào)至極。相比C#,java,php等,python等雜碎,它們面世不多久,馬上就有官方的標(biāo)準(zhǔn)庫(kù),你要說(shuō)這些雜碎的標(biāo)準(zhǔn)庫(kù)有多好,那也未必,問(wèn)題是就有大量人馬心悅誠(chéng)服高高興興地用之于開(kāi)發(fā),沒(méi)有什么所謂的破心智包袱影響開(kāi)發(fā)效率,甚至有人堅(jiān)持認(rèn)為直接用c開(kāi)發(fā),開(kāi)發(fā)速度都可以快過(guò)c++。哪像c++的破事一大坨,總之就是沒(méi)有一個(gè)好的基礎(chǔ)庫(kù),能夠讓所有的c++開(kāi)發(fā)者大爺滿(mǎn)意。你要說(shuō)這些c++大爺難侍候,也未必,因?yàn)榈拇_就是,不管怎么嘔心瀝血搗鼓出來(lái)的庫(kù),確實(shí)就是是存在這樣那樣的問(wèn)題,以至于后面的大量使用中,缺陷擴(kuò)大越來(lái)越明顯,難以忍受。

c++之父一直在重復(fù)強(qiáng)調(diào),c++本身美過(guò)西施,美得像楊玉環(huán),c++本身沒(méi)有問(wèn)題,只是欠缺好用的基礎(chǔ)庫(kù)。問(wèn)題是好用的基礎(chǔ)庫(kù)千喊萬(wàn)喊,遲遲就是不肯露面。這種情況下,就很讓人懷疑c++的存在意義了。因?yàn)楹苊黠@的事實(shí),其他的后生語(yǔ)言早就有龐大嚴(yán)謹(jǐn)?shù)臉?biāo)準(zhǔn)庫(kù),就你c++諸多借口,搞不出來(lái)合格的基礎(chǔ)庫(kù),難道不是c++語(yǔ)言本身就存在重大缺陷,所以才有此困境。很多c++的老殘黨(包括本座),都很贊同c++之父的觀點(diǎn),c++本身很好,就是欠缺好用的基礎(chǔ)庫(kù)。因此大力出奇跡,集整個(gè)c++界的精英,花多年的研發(fā),終于奮斗出來(lái)stl這個(gè)“精品”,另外,還準(zhǔn)備了一個(gè)候補(bǔ)的boost,以滿(mǎn)足非正常性的需求。

平心而論,stl還是相當(dāng)不錯(cuò)的,高性能,可擴(kuò)展,零懲罰,跨平臺(tái)等,基本上都滿(mǎn)足要求了。除了二進(jìn)制不能共用,除了編譯速度慢,除了代碼膨脹,除了出錯(cuò)的時(shí)候,可能鋪天蓋地的錯(cuò)誤,這也是沒(méi)有辦法的事情,世上哪有十全十美之事。總之,在基礎(chǔ)設(shè)施嚴(yán)重施缺乏的c++上面,能夠做出來(lái)這么一個(gè)玩意,已經(jīng)很不容易了。最顯然的事實(shí),面對(duì)著stl,除了一小撮亂黨,廣大勞動(dòng)群眾普遍都認(rèn)可stl。只是,既然stl是c++里面如此官方的基礎(chǔ)庫(kù),就有必要接受更高標(biāo)準(zhǔn)的考驗(yàn)。而最終,stl整個(gè)的設(shè)計(jì),也不可避免地,也絕非完美。這由此可見(jiàn),c++基礎(chǔ)庫(kù)開(kāi)發(fā)的難度。

stl里面的字符串,編碼,iostream,locale,allocator,algorithm里面算法函數(shù)的重復(fù)(非正交)等的問(wèn)題,都只是表象。根子上考察,stl的設(shè)計(jì)思路上犯了左傾和右傾的問(wèn)題。具體表現(xiàn)如下:
1、對(duì)動(dòng)態(tài)類(lèi)型的畏懼,對(duì)靜態(tài)類(lèi)型的過(guò)度擁抱。這個(gè)問(wèn)題在c++11之后,有一定程度的改善(出現(xiàn)了shared_ptr, any, variant,內(nèi)里用到動(dòng)態(tài)類(lèi)型,起碼有virtual的關(guān)鍵字使用)。最明顯的表現(xiàn)就是,把內(nèi)存分配器allocator做成靜態(tài)類(lèi)型信息,由此造成的麻煩,真是罄竹難書(shū)。同一個(gè)整型的vector,因?yàn)槭褂貌煌?lèi)型的allocator,也即是,vector<int, xalloc>和vector<int, yalloc>居然分屬不同的類(lèi)型,然后有一個(gè)函數(shù)要處理整型數(shù)組,要么只能做成模板函數(shù),放在頭文件上,c++原本就編譯速度龜慢,再這樣玩,簡(jiǎn)直雪上加霜;如果函數(shù)堅(jiān)持放在cpp文件里面,就只能處理專(zhuān)門(mén)的allocator的整型vector。基本上,用stl打造的公共代碼,都要做成頭文件的共享方式,然后每次小小修改,都要引起連鎖的編譯雪崩,大型的c++項(xiàng)目,對(duì)于頭文件的修改,考慮到感人的編譯速度,從來(lái)都是非到不得已的時(shí)候,能不動(dòng)就不動(dòng)。豈有此理,天理何在。c++17,標(biāo)準(zhǔn)庫(kù)終于接受多態(tài)的allocator,這算是對(duì)過(guò)去左傾激進(jìn)的糾正。某種程度可以上改善這個(gè)問(wèn)題,因?yàn)榈綍r(shí)候就可以只專(zhuān)門(mén)接受多態(tài)的allocator,只可惜,還不完備。

考慮批量分配arena類(lèi)型的allocator,理想情況下,對(duì)于在此arena allocator上分配的對(duì)象,假如僅僅涉及到內(nèi)存問(wèn)題,其實(shí)大多數(shù)情況下,析構(gòu)函數(shù)做的就只是釋放內(nèi)存。那么完全就可以不必苦逼的一個(gè)一個(gè)調(diào)用對(duì)象的析構(gòu)函數(shù),僅僅把a(bǔ)rena allocator的內(nèi)存歸還給系統(tǒng)就好了,這對(duì)于運(yùn)行性能的改善,意義重大,本座測(cè)過(guò),真是快了很多。問(wèn)題是,現(xiàn)有stl的體系下,不能保證容器的元素也使用和容器一樣的allocator,或者說(shuō),容器的allocator對(duì)象無(wú)法傳遞給它的元素,讓容器元素也使用同一個(gè)allocator對(duì)象來(lái)分配內(nèi)存。比如說(shuō),vector<string>,vector和string的allocator都用polymorphic_allocator,但是,vector的allocator對(duì)象和string的allocator可能不是同一個(gè)。這樣子,我們就不能僅僅簡(jiǎn)單的歸還allocator對(duì)象內(nèi)存,而必須像過(guò)去那樣子,對(duì)vector<string>里面的每一個(gè)string都調(diào)用析構(gòu)函數(shù)來(lái)歸還內(nèi)存了。差評(píng)!所以,一開(kāi)始,allocator就不應(yīng)該成為模板參數(shù)。另外,stl對(duì)allocator的粒度也考慮不周。allocator的迥異應(yīng)用場(chǎng)合起碼有幾種:1、靜態(tài)allocator,專(zhuān)門(mén)在main函數(shù)運(yùn)行前的使用,用于生成元數(shù)據(jù),這些元數(shù)據(jù)不必一一析構(gòu),主函數(shù)結(jié)束后,統(tǒng)一一次性釋放;2、全局的allocator,考慮多線(xiàn)程考慮并發(fā);3、scope,可以在一個(gè)任務(wù)下使用,任務(wù)完畢,統(tǒng)一釋放,這里包括函數(shù)或者協(xié)程;4、gui下的allocator等;只可惜,stl的allocator就只關(guān)注全局的allocator。

既然stl對(duì)allocator都可以搞成靜態(tài)類(lèi)型的鬼樣子,那么整個(gè)stl對(duì)運(yùn)行時(shí)類(lèi)型信息的忽視,逃避,就可想而知了。typeid得到的type_info,除了起到類(lèi)型的唯一標(biāo)識(shí)符的作用(動(dòng)態(tài)庫(kù)下,同一種類(lèi)型的type_info可能還不一樣),并得到類(lèi)型的名字之外,就不知道這個(gè)type_info還有什么鬼用。即便是這么一點(diǎn)小功能,還是能用于很多地方的,比如,any,variant,雙分派(double dispatch),由此可見(jiàn)運(yùn)行時(shí)類(lèi)型信息的重要性。

動(dòng)態(tài)類(lèi)型信息,也即是反射的重要性,一點(diǎn)都不亞于靜態(tài)類(lèi)型信息。意義重大,有了反射,我們就可以將類(lèi)型當(dāng)成變量,到處傳來(lái)傳去,也可以保存起來(lái),供后面使用,這里可做的文章,可挖掘的潛力太多了。假如c++的反射信息完善的話(huà),很多頭文件上的模板代碼實(shí)現(xiàn)就可以放到源文件里面,模板函數(shù)僅僅是提取一下靜態(tài)類(lèi)型的運(yùn)行時(shí)對(duì)象,類(lèi)型擦除,具體實(shí)現(xiàn)代碼就可以放到cpp代碼里面去。然后,虛模板函數(shù)也可以成為可能了。可以用來(lái)創(chuàng)建對(duì)象,析構(gòu)對(duì)象,消息發(fā)送,非侵入式的接口,序列化……,甚至,連多繼承也都是多余(當(dāng)然,多繼承還是很有用,只是這貨不應(yīng)該出現(xiàn)在正式的場(chǎng)合下)。最典型的例子,格式化printf,通過(guò)c++11的variadic template,提取類(lèi)型的運(yùn)行時(shí)類(lèi)型對(duì)象再連同入?yún)⒌牡刂罚涂梢詫?shí)現(xiàn)現(xiàn)在c庫(kù)里面的那個(gè)弱雞sprintf,類(lèi)型安全,緩沖安全,高性能的效果,不但類(lèi)型可擴(kuò)展,連同格式化的控制字符都可擴(kuò)展,甚至還能支持變量名字。stl里面的iostream、locale的設(shè)計(jì)成這個(gè)鬼樣子,也是因?yàn)檫\(yùn)行時(shí)的缺失導(dǎo)致。c++里面要妥當(dāng)?shù)靥幚砗米址幋a、字符串、文件流、locale這幾者的關(guān)系,絕對(duì)不是一件容易的事情,所以也難怪stl在這里的一塌糊涂。看過(guò)iostream,locale的實(shí)現(xiàn)源碼,大家都說(shuō)不好,大家都很難受,簡(jiǎn)直可以和mfc媲美,這是真的。

c++的反射可以做到零抽象,也即是,只對(duì)必要的類(lèi)型必要的信息做反射,不像java或者C#,不管是什么類(lèi)型,不管是信息,一些很明顯就是無(wú)關(guān)緊要的臨時(shí)的東西,,不管三七二十一,全部一股腦兒都反射起來(lái)。甚至,c++的反射,還能添加用戶(hù)自定義的反射信息,甚至,還能運(yùn)行時(shí)修改反射數(shù)據(jù)。這里,C#、java等,除了attribute或者注解,就別無(wú)他法了。反射的意義就在于,它提供了統(tǒng)一的接口,將類(lèi)型信息全部集中存放在同一個(gè)地方,任何關(guān)于類(lèi)型的運(yùn)行時(shí)信息,全部被標(biāo)準(zhǔn)化公理化。有了完善的反射信息,c++里面做一個(gè)eval都手到擒來(lái)。說(shuō)白了,反射就是靜態(tài)類(lèi)型語(yǔ)言里把“代碼做成數(shù)據(jù)”的最重要機(jī)制(沒(méi)有之一),雖然比之于lisp的“代碼即數(shù)據(jù)”弱一些,但是已經(jīng)可以應(yīng)付99%以上的需求了。甚至可以說(shuō),c++的基礎(chǔ)庫(kù)遲遲未出現(xiàn)的原因就是因?yàn)榉瓷涞娜毕鴮?dǎo)致的(當(dāng)然,沒(méi)有合適的內(nèi)存管理機(jī)制也是重要原因)。而可惜,stl對(duì)運(yùn)行時(shí)這一塊的關(guān)注,不到%1,這真是令人扼腕嘆息至極。

2,stl的抽象缺陷:臆造抽象,過(guò)度抽象,抽象不足,想當(dāng)然的抽象,大部分的精力都花在刀背上,或者說(shuō)是很形式化的學(xué)術(shù)研究。
突然發(fā)現(xiàn)文章已經(jīng)很長(zhǎng)了,就先打住,以后有空再好好發(fā)揮。對(duì)了,cppblog人氣太冷清,門(mén)可羅雀。再這樣下去,本座只好轉(zhuǎn)戰(zhàn)知乎了。

posted on 2017-07-07 16:52 華夏之火 閱讀(1264) 評(píng)論(6)  編輯 收藏 引用 所屬分類(lèi): c++技術(shù)探討

評(píng)論

# re: 非完美的stl 2017-07-08 09:50 eryar

mark!
持續(xù)關(guān)注中……  回復(fù)  更多評(píng)論   

# re: 非完美的stl 2017-07-08 22:57 天下

文章寫(xiě)的很好,以前搞C++標(biāo)準(zhǔn)的那些人不接地氣啊。
從C++ 11 開(kāi)始,開(kāi)始重視起來(lái)了,從C++17 module,,,,,以后會(huì)越來(lái)越好了。  回復(fù)  更多評(píng)論   

# re: 非完美的stl 2017-07-09 08:02 萬(wàn)連文

因?yàn)椴僮飨到y(tǒng) api 沒(méi)有標(biāo)準(zhǔn)化,所以語(yǔ)言也很難標(biāo)準(zhǔn)化。C++ 門(mén)檻高不符合現(xiàn)代主流開(kāi)發(fā)模式,所以人就少了,話(huà)題也自然少了。不過(guò)轉(zhuǎn)戰(zhàn)知乎是為了湊熱鬧嘛?  回復(fù)  更多評(píng)論   

# re: 非完美的stl 2017-07-09 09:54 華夏之火

@天下
從c++17的提案上看,標(biāo)準(zhǔn)會(huì)對(duì)于stl的保守改進(jìn)和迷糊認(rèn)識(shí),個(gè)人是徹底失望了。所幸的是,c++在大節(jié)上的進(jìn)化還是可取的  回復(fù)  更多評(píng)論   

# re: 非完美的stl 2017-07-09 09:57 華夏之火

@萬(wàn)連文
系統(tǒng)api的標(biāo)準(zhǔn)化是客觀原因,但是stl在二進(jìn)制層面上的復(fù)用之難,真是令人發(fā)指。知乎c++板塊上的人氣比cppblog要更熱鬧。  回復(fù)  更多評(píng)論   

# re: 非完美的stl 2017-07-10 09:15 ccsdu2009

cppblog 09-11很熱 現(xiàn)在確實(shí)不行了  回復(fù)  更多評(píng)論   

導(dǎo)航

統(tǒng)計(jì)

常用鏈接

留言簿(6)

隨筆分類(lèi)

隨筆檔案

搜索

積分與排名

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美在线播放高清精品| 久久高清福利视频| 欧美精品一线| 欧美在线观看日本一区| 亚洲午夜国产一区99re久久| 91久久国产自产拍夜夜嗨| 久久精品国产精品亚洲精品| 亚洲欧美精品在线观看| 国产综合一区二区| 欧美香蕉大胸在线视频观看| 亚洲国语精品自产拍在线观看| 欧美不卡在线| 久久精品国产99国产精品澳门| 午夜在线精品偷拍| 久久国产精品久久w女人spa| 欧美专区福利在线| 久久综合给合久久狠狠狠97色69| 国产伦精品一区| 国产女人18毛片水18精品| 国产欧美日韩另类视频免费观看| 国产欧美日韩精品专区| 国语自产精品视频在线看| 韩国av一区二区三区在线观看| 国产一区二区高清| 亚洲电影在线| 亚洲精品少妇网址| 亚洲自拍电影| 一区二区欧美激情| 午夜日韩视频| 久久网站热最新地址| 西西人体一区二区| 欧美www视频| 9l国产精品久久久久麻豆| 亚洲一区二区在线| 久久免费高清视频| 国产精品成人av性教育| 国内外成人在线| 国产九区一区在线| 亚洲国产福利在线| 亚洲午夜精品视频| 亚洲卡通欧美制服中文| 亚洲一区区二区| 另类春色校园亚洲| 一本色道久久88综合亚洲精品ⅰ | 久久青草欧美一区二区三区| 欧美成ee人免费视频| 99国产精品国产精品毛片| 欧美一区二区视频网站| 欧美日本在线看| 好吊日精品视频| 一区二区免费在线观看| 麻豆精品精华液| 一本到高清视频免费精品| 久久aⅴ乱码一区二区三区| 欧美日韩视频| 亚洲动漫精品| 久久国产精品久久w女人spa| 亚洲美女啪啪| 欧美成人午夜免费视在线看片| 国产精品尤物| 亚洲永久免费精品| 亚洲精品一区二区三区福利| 亚洲欧美日韩天堂| 欧美三级午夜理伦三级中视频| 亚洲国产91| 黄色免费成人| 午夜精品免费在线| 久久久久久尹人网香蕉| 国产精品99久久久久久www| 乱码第一页成人| 伊人精品视频| 欧美在线观看网站| 亚洲图片欧美一区| 国产精品v欧美精品∨日韩| 中文日韩欧美| 亚洲精品在线视频| 欧美精品午夜| 日韩午夜高潮| 亚洲精品乱码久久久久久日本蜜臀 | 亚洲欧美精品在线| 日韩视频一区| 国产精品户外野外| 久久精品日韩欧美| 久久久国产视频91| 日韩午夜在线| 亚洲一级在线观看| 伊人男人综合视频网| 亚洲欧洲日本mm| 国产精品乱人伦中文| 老司机一区二区三区| 欧美精品久久久久久久| 欧美一区视频在线| 免费日韩成人| 午夜精品在线观看| 欧美成人dvd在线视频| 中文日韩在线| 久久久伊人欧美| 午夜精品亚洲| 免费的成人av| 欧美一区二区三区在线看| 久久综合影视| 香蕉尹人综合在线观看| 免费亚洲一区二区| 久久国产天堂福利天堂| 欧美精品一区二区三区蜜臀| 久久国产综合精品| 欧美日韩视频不卡| 欧美jizzhd精品欧美巨大免费| 欧美三级乱码| 亚洲黄一区二区| 韩国三级电影久久久久久| 99国产精品一区| 亚洲欧洲日本在线| 久久久久久久久久久久久久一区| 中文国产成人精品久久一| 老司机精品视频网站| 欧美一区二区三区婷婷月色| 欧美日本国产一区| 欧美激情在线免费观看| 国产日本欧美一区二区三区| 99热在这里有精品免费| 日韩视频免费观看| 久热国产精品视频| 国产伦精品一区二区三区高清 | 亚洲激情网站| 1024日韩| 久久久精品一品道一区| 久久成人精品| 国产精自产拍久久久久久| 在线亚洲免费| 亚洲一级黄色| 欧美体内she精视频| 91久久黄色| 日韩午夜av| 欧美日韩国产精品专区| 亚洲日本黄色| 中文精品一区二区三区| 欧美日韩视频不卡| 99视频有精品| 亚洲欧美福利一区二区| 国产精品国产三级国产普通话三级| 日韩一级在线观看| 亚洲欧美韩国| 国产欧美一区二区精品性色| 欧美亚洲色图校园春色| 久久人人97超碰精品888| 激情欧美一区二区| 老牛国产精品一区的观看方式| 欧美激情一区在线| 亚洲视频一区二区| 国产精品羞羞答答| 久久精品二区亚洲w码| 欧美mv日韩mv国产网站| 亚洲精品欧美专区| 欧美天堂亚洲电影院在线播放| 亚洲欧美久久久久一区二区三区| 欧美在线观看网站| 亚洲国产一区二区三区a毛片| 欧美激情综合在线| 亚洲一区日韩| 欧美成人免费播放| 在线综合视频| 国产一区二区激情| 女仆av观看一区| 一本久久a久久精品亚洲| 久久精品2019中文字幕| 亚洲国产一区二区在线| 国产精品swag| 久久精品一区二区国产| 亚洲欧洲精品一区二区精品久久久| 亚洲一区二区免费视频| 国产亚洲精品成人av久久ww| 欧美成人免费网站| 亚洲欧美日韩区| 亚洲人成在线播放| 欧美一区二区视频97| 亚洲美女一区| 国产午夜精品久久久久久久| 欧美喷潮久久久xxxxx| 欧美一区二区啪啪| 亚洲伦理精品| 欧美激情乱人伦| 午夜在线成人av| 一区二区三区不卡视频在线观看| 国产一区二区中文| 欧美日韩在线免费| 久久亚洲精品一区| 性欧美办公室18xxxxhd| 一区二区三区国产精品| 欧美激情一区二区久久久| 久久精品视频亚洲| 亚洲欧美激情四射在线日| 日韩午夜电影av| 欧美成人午夜视频| 性做久久久久久| 亚洲视频在线观看视频| 亚洲三级毛片| 亚洲高清免费| 欧美韩国日本一区| 鲁大师成人一区二区三区|