問題多多的STL實現 (轉)

worldblog發表於2007-12-07
問題多多的STL實現 (轉)[@more@]

問題多多的STL實現

  開始學VC的時候還不知道STL為何物,只知道什麼CString之類的東西可以方便的出來字串,從此享受著C++帶來的好處。後來慢慢才看到STL的介紹,覺得真是個好東西,於是開始了STL的歷程,當然用的STL也是VC6的實現。開始看書作些小,小專案還覺得可以挺不錯的。
  第一次發現VC的STL有問題是在作一個HTTP的時候,由於需要在跨平平臺上面實現核心,所以STL成了首選,真的沒想到它的iostream竟然是執行緒不的,我的控制檯輸出成了簡直就是亂七八糟。害的我同步互斥一大堆,這下可是真的夠參的啊。奇怪的是VC自己的iostream.h卻是執行緒安全的哦,只可惜iostream.h在功能上面何STL的有一點點不同,使用的話就要修改部分的程式碼,或者要使用什麼#ifdef 之類的東西。從那個時候開始就想著要找一個好一點的STL實現版本。聽說SGI的實現不錯,於是搞了一個試一試,還行,沒有發現什麼問題,於是便一直在用。然而,不幸的事情又發生了,又一次在作傳送的模組的時候VC的竟然發現有洩漏情況,按照我的看來,程式碼沒有洩漏的情況(我對記憶體的使用向來小心),而且從偵錯程式的資訊表明是有部分string出現了記憶體洩漏。於是,將SGI的include目錄從options中刪除調,重新編譯除錯,好啦!真是奇怪,難道真的是SGI的記憶體洩漏了嗎,我單獨使用的時候沒有問題的哦,到現在我還沒有明白到底是什麼原因。有鑑於此,有返回來用VC的STL。只可惜好景不長,在最近一次測試中發現VC的STL實現又有一處不足之處,讓我細細道來。不知道大家有沒有遇到要在一個string物件中經常插入字串的情況呢(其實這種情況應該經常有才是)?為了示範,我將程式碼簡化了一下如下:
#define N 2000
 string body;
// body.reserve(N*26);
 for(int i=0;i  body += "abcdefghijklmnopqrstuvwxyz";
 cout<如果使用VC的STL的話,那麼你會發現這段程式碼執行得十分慢,當N再大一點的時候簡直就停下來不幹活了。我相信大家應該知道發生什麼事情了,string在不斷的重新分配記憶體中癱瘓了,其實只有聰明一點就可以避免這樣的癱瘓,最簡單有效的方法是每次重新重新分配記憶體的時候都分配目前大小的兩倍和按照一定規則分配,總之要使得越到後來越少需要重新分配記憶體。當然,不是沒有解決的方法,其實只要將上面的註釋去掉就可以執行飛快了。我不死心要看看SGI的實現如何,發現非常好,根VC(去掉註釋之後)一樣飛快。看來SGI的實現是下了功夫的。
  現在可就為難了,到底用誰的呢?好像誰的都不完美。現在只要在看看到底是不是SGI的實現有記憶體洩漏,或者等著看看VS的STL實現的怎麼樣了。或者有誰知道有更好的STL實現告知好嗎?


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-989473/,如需轉載,請註明出處,否則將追究法律責任。

相關文章