盡量使用vector和string來代替動態分配的陣列
這一刻,你決定使用new來進行動態分配,你需要肩負下列職責:
你必須確保有的人以後會delete這個分配。如果後面沒有delete,你的new就會產生乙個資源洩漏。
你必須確保使用了delete的正確形式。對於分配乙個單獨的物件,必須使用「delete」。對於分配乙個陣列,必須使用「delete 」。如果使用了delete的錯誤形式,結果會未定義。在一些平台上,程式在執行期會當掉。另一方面,它會默默地走向錯誤,有時候會造成資源洩漏,一些記憶體也隨之而去。
你必須確保只delete一次。如果乙個分配被刪除了不止一次,結果也會未定義。
職責真多,而且我不能理解為什麼如果可以省心你卻還要負責。感謝vector和string,用了它們就可以不像以前那麼麻煩了。
無論何時,你發現你自己準備動態分配乙個陣列(也就是,企圖寫「new t[...]」),你應該首先考慮使用乙個vector或乙個string。(一般來說,當t是乙個字元型別的時候使用string,否則使用vector,但我們在本條款的後面將遇到的情況中,vector可能是乙個合理的設計選擇。)vector和string消除了上面的負擔,因為它們管理自己的記憶體。當元素新增到那些容器中時它們的記憶體會增長,而且當乙個vector或string銷毀時,它的析構函式會自動銷毀容器中的元素,**存放那些元素的記憶體。
另外,vector和string是羽翼豐滿的序列容器,所以它們讓你支配可以作用於這樣的容器的整個stl演算法軍火庫。雖然陣列也可以用於stl演算法,但沒有提供像begin、end和size這樣的成員函式,也沒有內嵌像iterator、reverse_iterator或value_type那樣的typedef。而且char*指標當然不能和提供了專用成員函式的string競爭。stl用的越多,越會歧視內建的陣列。
如果你關心你必須繼續支援的遺留**,它們都是基於陣列的,放鬆點,無論如何都應該使用vector和string。條款16演示了把vector和string中的資料傳給需要array的api有多簡單,所以整合遺留**一般都沒有問題。
坦白地說,我想到了乙個(也是唯一乙個)用vector或string代替動態分配陣列會出現的問題,而且它只關係到string。很多string實現在後台使用了引用計數(參見條款15),乙個消除了不必要的記憶體分配和字元拷貝的策略,而且在很多應用中可以提高效能。事實上,一般認為通過引用計數優化字串很重要,所以c++標準委員會特別設法保證了那是乙個合法的實現。
唉,乙個程式設計師的優化就是其他人的抱怨,而且如果你在多執行緒環境中使用了引用計數的字串,你可能發現避免分配和拷貝所節省下的時間都花費在後台併發控制上了。(細節請參考sutter的文章《optimizations that aren't (in a multithreaded world)》[20]。)如果你在多執行緒環境中使用引用計數字串,就應該注意執行緒安全性支援所帶來的的效能下降問題。
要知道你正在使用的string實現是否是引用計數的,通常最簡單的方式是參考庫的文件。因為通常認為引用計數是一種優化,製作商一般把它作為乙個特性來吹捧。另一種方法是看庫的string實現的源**。我一般不推薦嘗試從庫源**中得到東西,但有時候這是唯一能找出你想知道的東西的方法。如果你選擇了這個方法,就要記住string是乙個basic_string的typedef(而wstring是basic_string的typedef),所以你真正需要看的是basic_string模板。最容易檢查的地方是可能的類建構函式。看看它是否在某處增加了引用計數。如果是,string就是引用計數的。如果不是,要麼就是string不是引用計數,要麼就是你看錯了**。呵呵。
如果你用到的string實現是引用計數的,而你想在已經確定string的引用計數支援是乙個效能問題的多執行緒環境中執行,你至少有三個合理的選擇,而且沒有乙個放棄了stl。第一,看看你的庫實現是否可以關閉引用計數,通常是通過改變預處理變數的值。當然那是不可移植的,但使工作變得可能,值得研究。第二,尋找或開發乙個不使用引用計數的string實現(或部分實現)替代品。第三,考慮使用vector來代替string,vector實現不允許使用引用計數,所以隱藏的多執行緒效能問題不會出現了。當然,如果你選擇了vector,你就放棄了string的專用成員函式,但大部分功能仍然可以通過stl演算法得到,所以你從一種語法切換到另一種不會失去很多功能。
所有的結果都是簡單的。如果你在使用動態分配陣列,你可能比需要的做更多的工作。要減輕你的負擔,就使用vector或string來代替
IHandler有些什麼作用
framework提供了一系列的介面和類,允許你對於http請求進行程式設計,而實現這一操作的乙個主要的介面,就是 ihttphandler 另乙個是ihttpmodule ihandler是乙個請求從客戶端瀏覽器發出,到達伺服器。asp.net最終會生成乙個ihandler來處理該請求。如果請求的...
什麼是CSS重置,有些什麼作用?
簡單的說就是重置瀏覽器的css預設屬性。因為瀏覽器的品種很多,每個瀏覽器的預設樣式也是不同的,比如標籤,在ie瀏覽器 firefox瀏覽器以及safari瀏覽器中的樣式都是不同的,所以,通過重置button標籤的css屬性,然後再將它統一定義,就可以產生相同的顯示效果。最常見的莫過於這個 這是重置所...
vector 和vector 有什麼區別?
圓括號 vectorv n 圓括號是建構函式,表示1個容量為n的vector 方括號vectorv n 表示n個vectorv 二維陣列 相當於vector v n 二維陣列 舉例vector v 10 表示 乙個容量 10的vector vector v 10 表示10個容量不確定的vector組...