隨心所「語」之 STL

2021-06-23 03:43:22 字數 2092 閱讀 7434

自己是個程式設計師,用c++開發也有5年時間了。期間,stl用的挺多了,對其印象也挺好的。

網上、周圍,許多人都不用stl,對此我比較疑惑。網上找了下,發現主要有下面幾個問題:

1、**膨脹。

stl是模板實現,在每乙個宣告、使用的地方,都會擴充套件,導致**膨脹。

個人看法:的確存在這樣乙個問題,暫時也沒看到好的解決。

2、不好用。

stl的實現,主要是通用化了,所以許多開發中的個性化使用,會特別彆扭。

個人看法:的確,有的時候用stl,的確是覺得很彆扭,因為**來適配stl的容器、演算法(當然,我也僅僅是使用,沒有做深入的研究,也許我用法存在問題)。但是,既然標準化、通用化,必然會有這樣的問題。我用c庫的時候,有些也覺得彆扭,要來適配它。這也是一樣的道理。另外,可能是認識不夠,用的不對也有可能。

3、效率不高

stl實現會包很多層,操作效率低;還有人說,封裝就引起了低效的可能。

個人看法:首先,低效的說法,是經過測試了麼?還是想象出來的?許多時候,想象出來的不一定是對的。其次,「封裝引起可能低效」,我覺得過於追求效率了。如果是這樣,為啥不直接用c、彙編呢?還搞什麼的物件導向幹啥呢?

4、跨平台問題(這個我看不懂,不好評價,把看到的copy。)

二進位制邊界混亂。對需要在專案中使用第三方函式庫的程式設計師來說,二進位制邊界是個頭痛的問題。c++ 在這一方面本身就處理得不算好,加上模板後起到的是雪上加霜的後果。沒有經驗的程式設計師會貪圖方便而在公開標頭檔案中使用 c++ 模板,如果這時呼叫方的編譯器選項設定或 stl 版本和編譯方不同,那麼就可能出現同樣的標頭檔案在不同的環境下二進位制布局不符的情況。——順便說一句,在過去十年裡,各個主流編譯器附帶的 stl 版本變化節奏不慢,所以這種由於編譯環境不同而導致的 bug 並不算罕見,但缺乏彙編知識的使用者難以排查。

5、歷史問題

許多公司年代久遠。stl剛出的時候,用過,發現不好用、有好多bug,就不用了。然後,就有了這個規矩、編碼規範。

個人看法:我不知道stl以前怎麼樣,但是現在看來,還是不錯的。

6、記憶體碎片問題

stl小記憶體分配做的不是很好,導致記憶體碎片,會導致問題。

個人看法:網上有許多人是這個看法,但是,我認為大多數是「道聽途說、人云亦云」,因為這麼些個人中,許多人僅僅是說了這個結論,而沒說原因;還有許多人認為stl是用new來分配記憶體的(stl是用malloc來分配的,可能老版本的stl是用new)。下面,我想來分析下「記憶體碎片」問題

原因分析:

stl本身內部有乙個記憶體池。一般,記憶體池都是乙個固定大小記憶體塊用煉錶鏈起來;那麼,把多個鍊錶,就可以組成多個大小記憶體塊的記憶體池。這就是stl的記憶體原理,它有8,16,32,64,128這幾種大小的記憶體塊組成的5個鍊錶組成的記憶體池。

記憶體分配的時候,大於128位元組的記憶體,直接用malloc直接分配;128以內,記憶體池中取;如果剛開始記憶體池中沒有記憶體塊,那麼會直接用malloc分配;當然,如果記憶體池中有,那麼可以直接取,大記憶體塊,可以重新劃分為小塊,給小塊用。注意:stl的物件是分配記憶體、和呼叫建構函式分開的,分配記憶體用malloc,建構函式是用replace new。

128以上的記憶體,直接用的malloc,那麼跟其他的沒有分別,所以,這個肯定不是stl的問題。128以下的記憶體,分配之後,是無法**的——這個應該就是造成記憶體碎片的原因:那塊小記憶體一直在那,無法**,導致記憶體不連貫。

但是,這種小記憶體真的會造成「記憶體碎片」導致記憶體不夠嗎?如果你的申請物件,主要是小物件的話,連續性申請,應該記憶體也是連續的;如果你的記憶體申請的大塊的,那麼就直接用malloc了,是可以**的。當然,我沒測試過記憶體碎片的問題(不知道怎麼測試),我不知道stl的記憶體碎片問題到底會是什麼樣子的。

另外,也許可以有改進的地方:stirng str('a',128);這樣的物件定義1m個,那麼就申請了1m個128的記憶體塊放到記憶體池中,128的記憶體塊,自動回分給其他的小記憶體用。所以,這種人為的預分配,那麼,應該可以緩解這個問題。

另外,tcmalloc安裝之後,對stl有效嗎?我覺得是有效的,因為stl用的是malloc。

參考:為何某些公司不允許使用c++ stl

隨心所語之「讀書」

電腦科學與技術畢業,幹c 開發4年,但是,發現好多東西 甚至是相關的東西都不會 不懂,於是,就需要學習,需要讀書。也許,這就是所謂的學無止境。我買的書,有30 本,但是看完的,卻是寥寥無幾,為什麼呢?簡單乙個詞 沒有恆心。但是,為什麼會沒有恆心呢?這裡,我有點沒 恆心 的心得,希望糾正這些之後,可以...

隨心所欲操作 Dos

碟符 冒號 例如 d cd 當前目錄下目錄或絕對路徑 進入指定目錄 可先用dir命令檢視當前目錄下檔案 cd 返回上一級目錄 cls 清理螢幕exit 退出終端ipconfig 檢視電腦ipcalc 開啟計算器 mspaint 畫圖工具 notepad 記事本 ping 用於測試網路連線量md 目錄...

oracle中隨心所欲排序

假設我現在又一張表 故障表 有列表故障狀態,狀態包含 待處理,報修,已審核,已處理,已完成 我們可以根據自己的意願,將故障狀態按照自己的想法排序出來 比如 順序一 待處理,報修,已審核,已處理,已完成 順序二已處理,已完成,待處理,報修,已審核 等等說白了就是隨心所欲排序,哎廢話太多了,主要讓讀者明...