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

huaxiazhihuo

 

stl的缺陷抽象不足

總的來說,stl整個的設計還是很有水準的,抽象度非常高,采用泛型template手法,回避面向對象里面的虛函數,回避了繼承,做到零懲罰,達到了非侵入式的要求(非侵入式遠比侵入式要好,當然設計難度也更高出許多)。高性能、可擴展,容器提供迭代器,而算法則作用在迭代器上,容器與算法之間通過迭代器完全解耦,同一種算法可用于多種容器,只要該容器的迭代器滿足其算法的要求;而同一個容器,又可被多種算法操作。更重要的是,容器與算法之間完全是開放的,或者說整個stl的體系是開放式,任何新的算法可用于已有的容器,任何新的容器又可被已有的算法所運算。然后,考慮到某些場合下容器的內存分配的高性能要求,分配器allocator也是可以替換,雖然逼格不高。此外,容器算法體系外的邊角料,比如智能指針、anyiostream、復數、functio等,也都高性能、類型安全、可擴展,基本上都是c++風格量身定制,這些都無可厚非。真的,stl作為c++的基礎庫,已經很不錯了。只是,依個人觀點,當然,以下純屬一家之言,某些情況下,stl可以做得更好,或者說api的使用上,可以更加清爽。以下對stl的非議,似有雞蛋里挑骨頭之嫌,吹毛求疵,強挑毛病。

 

軟件框架或者說庫的設計,是由需求決定的。脫離需求的設計,不管多精致,代碼多漂亮,一切都是廢物,都是空談。程序庫所能提供的功能,當然是越強大越好,可擴展,高性能,零懲罰,這些明面上的概念自然重要。殊不知,程序庫不能做的事情,或者說,其限制條件,或者說程序庫對外界的依賴條件,也很重要。一個基礎庫,如果它敢什么都做,那就意味著它什么都做不好。事情是這樣子的,如果只專注于某件目的,某些條件下的運用,往往可以獲得更大的靈活性或者獨立性。首先,代碼必須很好地完成基本需求,在此基礎上,才有資格談論點什么別的更高層次的概念。

 

上文提到stl由于對動態類型的排斥,所導致的功能殘缺以及二進制復用上的尷尬,如果stl愿意正面在動態類型做完善的考慮,相信stl的格局將會大很多,動態類型的話題,本文就不再過多重復了。當然,動態類型的引入必須滿足零懲罰的必要條件,c++的程序庫,所有不符合零懲罰的概念,最后都將被拋棄。所謂的零懲罰,就是不為用不到的任何特性付出一點點代價。請注意,這里的零懲罰必須是一步都不能妥協。

 

比如說,字符串實現的引用計數、短字符串優化這些奇技淫巧,就不是零懲罰,短字符串優化的懲罰度雖然很輕微,每次訪問字符串內容時,都要通過字符串長度來確定其數據的地址,長度小,字符串就放在對象本身上,從而避免動態內存分配。長度大,字符串就放在對象外的堆內存上。短字符串優化空間上的懲罰,字符串對象的占用內存變大了,到了長字符串的時候,字符串對象里因為短字符串的內存空間就沒有任何價值。在32位機上,字符串對象可以只包含內存分配器地址,字符緩沖起始地址,字符長度,緩沖的大小,滿打滿算,也就16個字節。而短字符串優化,就可能要用到32個字節。其實,如果有一個高性能的內存分配器,短字符串優化完全就可以沒有任何必要。算了,扯遠了,我們還是回到stl的設計思路上吧。

 

大家都知道,stl的字符串其實頂多就是一個字符緩沖管理對象。都98年的標準庫了,完全就沒有考慮字符編碼的需求,真是奇怪之極,令人發指的完全偷工減料。是啊,字符編碼不好搞,但是既然有這個需求,就必須支持啊,鴕鳥政策是行不通的。雖然說框架上設計可以既然做不好,那就完全都不做。但是,作為字符串組件,不鳥編碼,你真的好意思以字符串自居。撇開編碼,string居然有一百多個函數,更讓人驚喜的是,這一百多個函數用于日常的開發,還遠遠不能滿足需求。仔細看,這一坨函數大多數僅僅是為了性能需要上的重載,為了避開臨時string對象搞出來的累贅。所以,stl里面必須要有一個只讀的字符串,不涉及任何動態內存分配,也即是c++17string_viewstring_view里面有一個很良好的性質,string_view的任何一部分還是string_view(不同于c語言字符串的以零結束,必須帶零的右部分才是字符串),然后string_view就可以做只讀字符串上的運算,比如比較,查找,替換,截取等,分攤string里面大部分的函數。很奇怪的是,string_view這么有用的概念,居然要到c++17里面才有,都不知道stl委員會的人才在想什么。由此可見,如果class里面的成員函數如果過多,好比一百多個,那么其設計思路就一定大有問題,甭管它的出處來自何方。

 

同理可得,只讀數組array_view也是很有用的概念,它是內存塊的抽象。array_view的任何一部分都是array_view,不同于string_viewarray_view僅僅是長度不能變,但是其元素可修改,可以把array_view看成其他語言的數組,但是array_view不能創建,只能從vector或者c++數組獲得,或者又可以看成是切片,array_view本身可以有排序和二分查找的成員函數。Array_view可以取代大多數vector下的使用場合。很奇怪的是,這么強有力地概念,c++17上居然就可以沒有。差評!另外,我想說的是,對于排序二分查找,就僅僅用于連續內存塊上就好了,其他地方則可免就免,搞那么多飛機干什么,stl在排序二分查找的處理上顯然就是過度抽象。

 

或者有人反對,array_viewstring_view不就是兩個新的容器,把它們加進stl里,不就行了,stl體系設計完備,絕對對外開放。不是這樣的,array_viewstring_view的出現,嚴重影響現有的stringvector的設計,這兩者必須基于array_viewstring_view的存在整個重新設計。

 

Stl就是對良好性質的基礎數據結構缺乏抽象,容器的設計只到迭代器為止,提供迭代器之后,就高高興興對外宣稱完成任務,不再深入地挖掘,可謂固步自封,淺嘗輒止。在stl的世界觀里面,就只有迭代器,什么都搞成迭代器,什么都只做到迭代器就止步不前,可悲可恨可嘆!在其他基礎容器的設計上,缺乏深入的考慮,罔顧需求,罔顧用戶體驗。對于鏈表的定位,就足以體現其眼光的狹隘。

 

眾所周知,單向鏈表的尾部也是單向鏈表,可類比haskell或者lisp的列表,這么強有力的好概念,stl里居然完全沒有單向鏈表,更別說凸顯此概念。當然,單向鏈表里面只有一個節點指針,不能包含內存分配器的,也不能有元素計數器,而且生命周期也要由用戶控制,但是,用戶控制就用戶控制,這一點都不要緊,特別是存在arena allocator的情況下,拼命的new單向鏈表,最后由arena allocator來統一釋放內存好了。總之,stl太中規中矩,對于離經叛道的idea,完全就是逃避就是無視,對于動態類型的處理,也是這種態度。Stlallocator的處置,太過簡單粗暴,一步錯,步步錯。

 

而雙向鏈表,在付出O(n)的訪問代價后,在為每個元素都要付出前后節點的內存占用后,應該得到咋樣的回報呢?顯然,stllistO(1)插入,O(n)通過迭代器刪除元素,無論如何,完全不能接受,回報太少。首先,O(1)刪除元素,不能妥協。為達此目的,我們先開發一個隱式侵入式要求的循環鏈表,它不關心元素的生命周期,任何插入此鏈表的元素,其首地址之前必須存在前后節點的指針。然后,鏈表本身的首兩個字段是頭節點和尾節點,內存布局上看,循環鏈表自身就是一個鏈表節點,一開始,鏈表為空,其首尾字段都指向自身。這種內存布局下的循環鏈表和其節點的關系非常松散,節點的插入和刪除,只需要修改其前后節點的前后指針的值,完全不需要經過鏈表本身來完成操作。要刪除元素時,只要往前爬兩個指針的位置,就得到包含此元素的節點,進而時間O(1)上刪除節點,何其方便。顯然,循環鏈表不能包含節點數量,否則每次刪除插入節點,都要加11鏈表的計數器,節點和鏈表就不能徹底的解耦。這種內存布局上的循環鏈表,就可支持多態了,比如,比如,xlist<Base> objects,可把Derived1類型的對象d1Derived2類型的對象d2,插入到循環鏈表xlist里,只要d1d2的前面保留前后節點指針的內存空間。

 

然后,封裝這個裸循環鏈表,用allocator管理其節點元素的生命周期,好像stllist那樣,創建刪除節點元素。封裝過得鏈表,節點和鏈表的關系就不再松散,因為節點必須通過鏈表的allocator來分配內存回收內存。但是,O(1)時間的刪除節點,完全是沒有任何問題。并且也能支持多態,可插入子類對象。相比之下,可見stllist有多弱雞,簡直不知所謂。

 

不管怎么說都好,stl里面對字符串的支持很薄弱,要有多不方便就有多不方便,雖然比C要好多了,這個必須的。當然,有人會辯解,很多操作很容易就可以添加進去的,但是,如果標準庫支持的話,畢竟情況會好很多,不一定要做成成員函數,之所以遲遲未添加這些常用的字符串函數,懷疑是因為找不到合適的方式添加這些操作。字符串的操作可分為兩大類,1、生成字符串;2、解析字符串。這兩大類,都是格式化大顯身手的地方,也即是sprintfscanfc++下的格式化函數,可以是類型安全,緩沖不會溢出,支持容器,支持成員變量名字。這樣子,通過格式化,可以吸收大部分的字符串操作。可惜,stl對于反射的排斥,功能強大的格式化處理是不會出現的,而字符串操作,也將永遠是stl的永遠之痛。堂堂c++唯一的官方標準庫,居然對最常用(可以說沒有之一)的編程任務字符串操作支持如此灰頭土臉,真是要笑死人了。為什么這么說,因為本座的庫早就實現了這些想法(包括string_viewarray_view,不帶allocator類型參數的各種容器),字符串的處理,簡直不要太方便,比之stl的破爛,不可同日而語。比如,在c++中,完全就可以做如下的字符串操作。
vector<byte> buf = {…};
u8string codes;
Fmt(codes, “{ 
~%.2x}”, buf);//codes就是buf的16進制顯示,小寫,即是”xx xx … xx”。符號~表示前面的部分(這里是一個空格)作為元素之間的分隔符。
vector<byte> copied;
Scanf(codes, “{ 
~%.2x}”, &copied);//這樣就把文本codes解析到copied里面去
assert(Equals(buf, copied));

不用格式化,在stl下,用iostream要實現這樣的效果,不知道要寫多少惡心的代碼,反正很多人都已經想吐了。有了格式化之后,日子美好了好多。對了,上面的vector<byte>可換成list<byte>,代碼完全都可以成立。Fmt的第一個參數表示格式化結果的目標輸出對象,可以是文件,標準輸出stdoutgui的文本框等。同時,Scanf的第一個參數表示格式化的輸入源,可以是stdin,文件等。總之,FmtScanf這兩個函數就可以概括所有的格式化操作,這兩個函數,基本上可以解決滿足日常上大多數關于字符串的操作。其實格式化的實現,離不開運行時類型信息的支持,本座要有多大的怨念,才會一而再地抱怨stl在反射上的無所作為。

至于iostreamlocale本座就不想批評太多,免得傷心難過,因為iostream竟然出自c++老父bs之手,必須是精品,某種意義上,確實是!


啰里啰嗦一大堆不滿,還沒有寫完。后一篇的文章,主角是迭代器,整個stl的大亮點,同時也是大敗筆。既造就了stl框架的靈活性,同時也導致stl函數使用上的不方便,特別是stl算法函數的冗余,非正交,不可組合。你看看,findfind_ifremove, remove_copy, remove_copy_if, remove_if,……,難道就不覺得面目可憎,低逼格,心里難受,堂堂大c++標準庫算法的正兒八經的函數,標準會要有多扭曲的審美觀,才會這樣設計如此丑陋的接口,難道就沒有一點點的羞恥心理!這種接口怎么可以拿出來見人見證,丟人現眼。

posted on 2017-07-09 11:35 華夏之火 閱讀(1220) 評論(5)  編輯 收藏 引用 所屬分類: c++技術探討

評論

# re: stl的缺陷抽象不足 2017-07-10 11:49 天下

寫的很好,學習了,既從宏觀入手俯瞰,也在細節處分析的透徹.
呵呵,
,搞C++的都有點完美主義.

我現在是自己用MFC封裝輪子,湊合著用
界面用xtreme toolkit pro搞.
有機會打算玩下kotlin做android開發.

  回復  更多評論   

# re: stl的缺陷抽象不足 2017-07-10 11:55 天下

做linux開發就用QT,都搞過....QT還不錯
  回復  更多評論   

# re: stl的缺陷抽象不足 2017-07-10 14:08 華夏之火

@天下
mfc,xtream,qt都是垃圾,都不值得花時間。c++的gui開發,除了qt,似乎也沒有更好的選擇  回復  更多評論   

# re: stl的缺陷抽象不足 2017-07-10 15:29 冬瓜

@華夏之火
相對來說,C++搞UI的開發,還是C++Builder最好。  回復  更多評論   

# re: stl的缺陷抽象不足 2017-07-10 15:34 冬瓜

貼主講到的很多問題,都是歷史問題。那個時候電腦的性能還是非常差的,不像現在。那個時候,能跑一個win95,才8M或16M內存,CPU才100mhz,所以那個時候包括MFC,STL設計的都讓現代人不理解。  回復  更多評論   

導航

統計

常用鏈接

留言簿(6)

隨筆分類

隨筆檔案

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产欧美一区二区精品忘忧草| 久久国产精品毛片| 欧美va天堂| 99re6热在线精品视频播放速度 | 狠狠v欧美v日韩v亚洲ⅴ| 久久婷婷蜜乳一本欲蜜臀| 久久日韩精品| 99re热精品| 香蕉久久一区二区不卡无毒影院| 狠狠色伊人亚洲综合成人| 欧美激情一区三区| 国产精品狠色婷| 久久综合电影| 欧美日韩久久| 久久人人97超碰人人澡爱香蕉| 久久资源在线| 午夜精品视频网站| 狂野欧美一区| 美女国产一区| 欧美四级在线观看| 麻豆九一精品爱看视频在线观看免费| 免费在线观看精品| 午夜精品久久久久久久蜜桃app | 国产精品一区二区女厕厕| 久久资源在线| 欧美特黄a级高清免费大片a级| 久久婷婷综合激情| 欧美午夜无遮挡| 欧美成人精品1314www| 国产精品第十页| 欧美 日韩 国产精品免费观看| 国产精品久久久久久久久果冻传媒 | 欧美日韩日韩| 欧美1区2区3区| 国产精品一区二区久激情瑜伽| 亚洲高清在线精品| 国产日韩欧美视频在线| 日韩一级免费| 亚洲精品久久久久久一区二区 | 亚洲国产成人久久综合一区| 国产一区二区久久精品| 99国产欧美久久久精品| 亚洲韩国精品一区| 久久麻豆一区二区| 久久国产手机看片| 国产精品久久久对白| 亚洲经典三级| 亚洲电影免费观看高清完整版在线 | 亚洲特级毛片| 欧美精品一区二区三区一线天视频 | 影音先锋日韩精品| 欧美一区二区高清| 性感少妇一区| 国产精品视频网址| 国产精品99久久99久久久二8| 亚洲乱码国产乱码精品精可以看| 久久午夜电影网| 久久一区二区三区超碰国产精品 | 蜜桃av一区| 亚洲成色777777女色窝| 欲色影视综合吧| 久久精品免费看| 久热精品在线| 在线播放日韩专区| 狂野欧美一区| 亚洲国产成人不卡| 日韩写真在线| 欧美日韩一区在线| 亚洲视频电影图片偷拍一区| 亚洲欧美经典视频| 国产日韩精品一区二区浪潮av| 午夜精品久久久久久久蜜桃app | 中文精品视频| 欧美一区成人| 激情综合中文娱乐网| 久久婷婷成人综合色| 欧美激情亚洲另类| 一本色道久久88亚洲综合88| 欧美少妇一区| 欧美一区二区女人| 欧美黄色一级视频| 一本色道久久88综合日韩精品| 欧美小视频在线| 欧美亚洲一区二区在线| 欧美大片免费久久精品三p | 久久久久久久综合| 亚洲第一黄网| 欧美日韩精品免费在线观看视频| 亚洲一区免费看| 美日韩免费视频| 9久re热视频在线精品| 国产精品视频在线观看| 久久久九九九九| 亚洲精品乱码久久久久久蜜桃91| 亚洲欧美综合网| 亚洲国产1区| 欧美婷婷久久| 久久久成人网| 艳女tv在线观看国产一区| 久久偷看各类wc女厕嘘嘘偷窃| 日韩视频在线免费观看| 国产午夜亚洲精品羞羞网站| 欧美精品日韩www.p站| 久久不射中文字幕| 99视频国产精品免费观看| 久久综合给合久久狠狠色| 亚洲视频免费| 亚洲电影免费观看高清完整版| 国产精品欧美经典| 欧美成人伊人久久综合网| 午夜精品影院在线观看| 亚洲人午夜精品免费| 久久综合伊人77777| 亚洲影视在线播放| 亚洲日韩第九十九页| 国产主播一区二区三区| 欧美日韩中文在线| 欧美激情第一页xxx| 欧美一区高清| 亚洲女优在线| 一二三区精品福利视频| 亚洲欧洲精品一区| 欧美福利一区二区| 久久伊人一区二区| 久久久久久网| 欧美在线视频在线播放完整版免费观看 | 国产亚洲精品bv在线观看| 欧美色图一区二区三区| 欧美日韩成人激情| 欧美区一区二| 欧美女主播在线| 欧美大学生性色视频| 麻豆精品传媒视频| 久久伊伊香蕉| 鲁大师影院一区二区三区| 久久青草久久| 久久躁日日躁aaaaxxxx| 国产精品久久久久久久久果冻传媒| 亚洲国产影院| 最新精品在线| 亚洲日本电影| 中文在线不卡| 亚洲主播在线播放| 亚洲免费在线电影| 欧美一区二区三区免费观看| 香蕉成人久久| 久久久av水蜜桃| 久久亚洲一区二区三区四区| 蜜桃av噜噜一区| 欧美激情精品久久久久久久变态| 欧美成人首页| 亚洲国产一区在线| 99re6这里只有精品| 亚洲一区二区三区影院| 先锋影音久久久| 久久久亚洲国产天美传媒修理工 | 99riav1国产精品视频| 宅男噜噜噜66国产日韩在线观看| 亚洲一区二区三区中文字幕| 午夜精品福利一区二区蜜股av| 久久国产一区| 欧美激情综合网| 国产精品美女久久久久久免费| 国产一区二区三区四区在线观看| 激情偷拍久久| 亚洲免费高清| 欧美专区日韩视频| 欧美成人精品在线| 99热在线精品观看| 久久精品国产亚洲一区二区三区| 美日韩免费视频| 欧美性jizz18性欧美| 韩国一区电影| 一区二区三区精品在线| 欧美一区二区免费观在线| 欧美va天堂| 亚洲伊人第一页| 欧美电影在线观看完整版| 国产精品视频1区| 亚洲精品1区2区| 亚洲一区在线视频| 欧美风情在线| 亚洲欧美视频在线观看视频| 欧美高清一区| 韩国精品久久久999| 亚洲一级片在线看| 欧美成人一区二区三区在线观看| 亚洲一区在线看| 欧美激情影院| 亚洲二区在线| 久久精品视频在线看| 一区二区三区 在线观看视频| 免费成人美女女| 韩日在线一区| 欧美怡红院视频一区二区三区| 亚洲片在线资源| 美女主播视频一区| 黄色成人片子| 久久永久免费| 性欧美xxxx视频在线观看|