1. 程式人生 > >STL中使用reserve()提升效率

STL中使用reserve()提升效率

前言:我們使用STL容器的時候,它們能夠自動進行容量擴充,所以在一定程度上,我們是不需要去考慮它們的資源分配的。

需要注意的有兩點:

1、當我們知道容器中存放元素的大致數量時,可以通過reserve()方法減少系統對容器進行資源再分配的次數;

2、當我們能夠確定容器中存放元素的最大數量後,可以通過reserve()修剪超額資源,減少不必要開銷

關於第一點,首先來看個例子:

vector<int> vInt;
vInt.push_back (99);
for (int i = 0; i != 1000; ++i) {
    vInt.push_back (i);
}


這樣也許不能夠看出來很大的問題,那麼我們新增點東西:

vector<int> vInt;
vInt.push_back (99);
int* p = &vInt[0];
int reallcTime = 0;
for (int i = 0; i != 1000; ++i) {
    vInt.push_back (i);
    if (p != &vInt[0]) {
        reallcTime++;
        cout << "Reallocate times: " << reallcTime << endl;
        cout << "&vInt[0]   now:   " << &vInt[0] << endl;
        p = &vInt[0];
    }
}

output:
Reallocate times: 1
&vInt[0]   now:   003F66E0
Reallocate times: 2
&vInt[0]   now:   003F67C0
Reallocate times: 3
&vInt[0]   now:   003F6808
Reallocate times: 4
&vInt[0]   now:   003F6A30
Reallocate times: 5
&vInt[0]   now:   003F67C0
Reallocate times: 6
&vInt[0]   now:   003F6820
Reallocate times: 7
&vInt[0]   now:   003F6A30
Reallocate times: 8
&vInt[0]   now:   003F67C0
Reallocate times: 9
&vInt[0]   now:   003F6A30
Reallocate times: 10
&vInt[0]   now:   003F6B18
Reallocate times: 11
&vInt[0]   now:   003F6C50
Reallocate times: 12
&vInt[0]   now:   003F6E08
Reallocate times: 13
&vInt[0]   now:   003F6A30
Reallocate times: 14
&vInt[0]   now:   003F6DB8
Reallocate times: 15
&vInt[0]   now:   003F72E8
Reallocate times: 16
&vInt[0]   now:   003F7A90
Reallocate times: 17

這下看出來了吧,在往vInt這個容器中新增1000個數據時,它的首地址變了17次(即容器17次被重新分配記憶體),這時候我們新增一行資料:

vector<int> vInt;
vInt.push_back (99);
vInt.reserve (1001);  // 新增的一行
int* p = &vInt[0];
int reallcTime = 0;
for (int i = 0; i != 1000; ++i) {
    vInt.push_back (i);
    if (p != &vInt[0]) {
        reallcTime++;
        cout << "Reallocate times: " << reallcTime << endl;
        cout << "&vInt[0]   now:   " << &vInt[0] << endl;
        p = &vInt[0];
    }
}
output:

這時候,完全沒有記憶體再分配了,僅僅只是在呼叫reserve()的時候會分配一次,1000個數據,省下了16次容器記憶體分配。

關於第二點,這個很好理解:容器中元素的數量不超過某個值,那就別把容器弄的太大,多了就是浪費!