【Example】C++ Vector 內存預分配的良好習慣


為什么要對 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%。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM