vector 1 5倍擴容優於2倍擴容的原因

2021-09-13 15:46:49 字數 583 閱讀 2537

假設我們一開始申請了 16byte 的空間。

當需要更多空間的時候,將首先申請 32byte,然後釋放掉之前的 16byte。這釋放掉的16byte 的空間就閒置在了記憶體中。

當還需要更多空間的時候,你將首先申請 64byte,然後釋放掉之前的 32byte。這將在記憶體中留下乙個48byte 的閒置空間(假定之前的 16byte 和此時釋放的32byte 合併)

擴容因子為2時,上述例子表明:每次擴容,我們釋放掉的記憶體連線起來的大小,都小於即將要分配的記憶體大小。

假設我們一開始申請了 16byte 的空間。

當需要更多空間的時候,將申請 24 byte ,然後釋放掉 16 ,在記憶體中留下 16byte 的空閒空間。

當需要更多空間的時候,將申請 36 byte,然後釋放掉 24,在記憶體中留下 40byte (16 + 24)的空閒空間。

當需要更多空間的時候,將申請 54 byte,然後釋放 36,在記憶體中留下 76byte。

當需要更多空間的時候,將申請 81 byte,然後釋放 54, 在記憶體中留下 130byte。

當需要更多空間的時候,將申請 122 byte 的空間(復用記憶體中閒置的 130byte)

vector擴容2倍與1 5倍

如果按2倍擴容,第n次擴容需要的空間恰好比前n 1擴容要求的空間總和要大,那麼即使在前n 1次分配空間都是連續排列的最好情況下,他們留下的空間也不足以分配給此次擴容。理想分配方案是是在第n次resize 的時候能復用之前n 1次釋放的記憶體,但選擇兩倍的增長比如像這樣 1,2,4,8,16,32,可...

vector 擴容為什麼要以1 5倍或者2倍擴容

我們知道,vector 在需要的時候會擴容,在 vs 下是 1.5倍,在 gcc 下是 2 倍。那麼會產生兩個問題 1 為什麼是成倍增長,而不是每次增長乙個固定大小的容量呢?2 為什麼是以 2 倍或者 1.5 倍增長,而不是以 3 倍或者 4 倍等增長呢?1 第乙個問題 如果已成倍方式增長。假定有 ...

vector擴容原理說明

include include using namespace std int main system pause return 0 總結 對比可以發現採用採用成倍方式擴容,可以保證常數的時間複雜度,而增加指定大小的容量只能達到o n 的時間複雜度,因此,使用成倍的方式擴容。第二個問題 vector...