為什么要對 Vector 進行內存預分配?
1,Vector 本身是一個內存只會增長不會減小的容器。
2,Vector 存在 size 和 capacity 兩種計數,size 即元素個數,capacity 則是容量即 vector 在內存當中的大小,理論上始終 capacity >= size。
3,Vector 的 push_back 函數邏輯是,當 capacity 不夠的時候,去申請一塊新內存,將原有數據拷貝到新內存再釋放舊內存,中間有一個申請、拷貝、釋放的操作。
4,最根本目的是加強 Vector 寫入時的性能。
什么樣的 Vector 需要進行內存預分配?
存儲的對象內存消耗大且數量多的Vector。
如果一個Vector就存了幾百條int,則沒必要去折騰。
#include <iostream> #include <vector> using std::vector; // 隨便創建一個結構體 typedef struct Point { int x; int y; int val; // 順帶演示統一初始化 (現代C++) Point(int x, int y, int value) : x(x), y(y), val(value) {}; }; int main() { // 定義兩個 vector vector<Point> pointsT1; vector<Point> pointsT2; for (size_t i = 0; i < 45000; i++) { pointsT1.push_back(Point(i, i, -99999)); } // 執行耗時 8.3213 毫秒
pointsT2.reserve(45000); for (size_t i = 0; i < 45000; i++) { pointsT2.push_back(Point(i, i, -99999)); } // 執行耗時 3.7997 毫秒 return EXIT_SUCCESS; }
=================================
由此可見,進行了預分配內存操作的 Vector 存入時間縮短了 65%。