(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++物件模型
- c/c++資料對齊問題C++
- 深入javascript資料存取JavaScript
- STL-Vector容量問題:
- C++ STL -- vectorC++
- C++ STL -- listC++
- C++ STL -- HashTableC++
- C++ STL stackC++
- C++ STL listC++
- 【dawn·資料結構】迷宮問題(C++)資料結構C++
- 資料中心能耗和效率問題
- C++ STL deque容器C++
- day4-03資料存取
- 關於c++ STL map 和 unordered_map 的效率的對比測試C++
- C++ stl容器詳解C++
- C++ STL之迭代器C++
- C++ STL stack容器——棧C++
- C++ STL迭代器(iterator)C++
- (C++)資料結構實驗二——迷宮問題C++資料結構
- C++ STL list連結串列C++
- STL自帶的swap方法有什麼問題?
- C++提高程式設計-STLC++程式設計
- 資料儲存:FMDB-模型進行存取模型
- java map存取重複值、幼兒園分班問題、map按key自動排序問題Java排序
- Redis在存取序列化和反序列化效能問題Redis
- 談談 C++ STL 中的迭代器C++
- 班級問題(c++)C++
- c++ 常見問題C++
- C++的0.3問題C++
- 測試團隊效率問題思考
- 硬碟問題導致Gbase資料庫叢集SQL任務執行效率變慢硬碟資料庫SQL
- vue-資料問題Vue
- MutableLiveData 舊資料問題LiveData
- 資料問題排查思路
- RDMA:遠端直接存取資料,國產網路卡
- Unity Webgl小遊戲存取資料的解決方案UnityWeb遊戲
- C++ 學習筆記之——STL 庫 queueC++筆記