(C++)STL資料存取效率問題
我們向STL容器中放入資料的時候,會在記憶體中複製一份該資料的內容。這裡“資料”可以代表各種例項化的物件,因為有複製操作,所以會依賴於類的 拷貝建構函式 及 賦值建構函式:
Class Widget {
Public:
…
Widget (const Widget&);
Widget& operator = (const Widget&);
};
其實,在寫一個類的時候,哪怕忘了寫這兩個函式,編譯器也會偷偷地為我們新增並實現,但如果我們需要在該函式中實現一些其他功能,我們就得顯示地去實現它們。
假定容器存放以上程式碼中的Widget類,如果其本身所佔記憶體並不大,拷貝及賦值建構函式並不複雜,那整個Copy過程將會是很快的。但如果Widget類擁有多項屬性,其本身就佔有了大量的記憶體空間(這個大量的標準本人尚未研究),又或者自己實現的拷貝及賦值建構函式效率太坑爹,那可以想象,每向容器中存放一個Widget物件,都將會佔用大量的系統資源。
熟悉JAVA開發的朋友知道,JAVA容器類中除存放八種基本資料型別會拷貝一份外,其餘的都存放資料物件的引用(Reference)。在C++中也提倡這樣做,如
vector <Widget*> vWidgets;
該vector容器中存放Widget物件的記憶體地址,但是此時需要注意,容器中存放的指標所指向的物件是有要求的,除非是在某一程式碼段內使用時可以用臨時物件,否則必須是用new關鍵字在堆上建立的物件,而在使用完後還需要對其進行清理。一般這些清理工作都會在物件使用完後進行:
vector <Widget*>::iterator iter;
for (iter = vWidgets.begin (); iter != vWidgets.end (); ++iter) {
delete (*iter);
}
而如果需要對容器中存放的指標本身進行刪除,這裡恐怕不是三言兩語能講清楚了,其實記住一條:首先得清理指標指向的資料,再來清理指標本身。若弄反了,像什麼迭代器失效、清理錯了物件等一系列問題都有可能產生。這個類似於我們寫這樣的程式碼:
int* p = new int (5);
if (p != NULL) {
delete p; // 先清理*p
p = NULL; // 再清理p
}
所以在資料物件佔用記憶體較大時,我們可以通過存放其指標來提高效率。
而關於C++容器中對智慧指標的存放,所注意的也頗多,這裡先賣個關子,有興趣的朋友可以先去閱讀《Effective STL》一書。
使用C++中的STL容器,也許一開始會覺得麻煩,不如C#或者JAVA中的安全與方便,但用多了,會覺得它是很靈活的,怎樣去搭配完全可以由你自己控制,用一個詞來形容就是civilized。
深入閱讀:《Effective STL》item 3 : Make copying cheap and correct for objects in containers
《STL原始碼剖析》
關於容器內資料本身的清理: 《Effective STL》 《More Exceptional C++》item 2
相關文章
- 深度解讀《深度探索C++物件模型》之資料成員的存取效率分析(一)C++物件模型
- 深度解讀《深度探索C++物件模型》之資料成員的存取效率分析(二)C++物件模型
- 深度解讀《深度探索C++物件模型》之資料成員的存取效率分析(三)C++物件模型
- session的存取問題Session
- [C++] STL相關面試題C++面試題
- c/c++資料對齊問題C++
- 深入javascript資料存取JavaScript
- 資料中心能耗和效率問題
- C++ STL listC++
- C++ STL stackC++
- C++ STL -- vectorC++
- C++ STL -- listC++
- C++ STL -- HashTableC++
- [轉]C++ 之 stl::string 寫時拷貝導致的問題C++
- 【dawn·資料結構】迷宮問題(C++)資料結構C++
- day4-03資料存取
- 加快linux存取資料(轉)Linux
- 【C++ STL】Set用法C++
- C++ 模板與STLC++
- C++ STL deque容器C++
- 問題多多的STL實現 (轉)
- 關於c++ STL map 和 unordered_map 的效率的對比測試C++
- 由一個C++版本猜數字遊戲引起的效率問題C++遊戲
- (C++)資料結構實驗二——迷宮問題C++資料結構
- C++ stl容器詳解C++
- C++ STL之迭代器C++
- C++ STL迭代器(iterator)C++
- C++ STL學習——vectorC++
- C++ STL容器總結C++
- C++ STL簡介 (轉)C++
- C++ STL stack容器——棧C++
- 資料庫執行計劃和資料存取方式資料庫
- java map存取重複值、幼兒園分班問題、map按key自動排序問題Java排序
- C++實踐:STL容器reserveC++
- C++ STL學習之stack。C++
- C++ STL list連結串列C++
- 資料庫學習:在資料庫中存取檔案(轉)資料庫
- 資料插入問題。