色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

back擴容機制為什么不考慮在尾元素后面的空間申請內存

錢瀠龍2年前10瀏覽0評論

back擴容機制為什么不考慮在尾元素后面的空間申請內存?

首先我們看一下官方文檔對vector的說明:

再看一下對push_back函數的說明:

總結起來就是初始時刻vector的capacity為0,塞入第一個元素后capacity增加為1,vector內部是通過數組來實現的,它占用的是一塊連續空間,當空間不足時它會重新申請空間,并將當前內容一并拷貝到新的空間,下圖是vector內存的擴充的示意圖。

有一點需要說明,容量擴充并不總是擴充至兩倍,具體的倍數取決于編譯器,比如在GCC下是兩倍,而在VS2017中是1.5倍,下圖是在VS中的實驗結果。

可見每push_back一個元素,vector的size就增加1,而capacity則以1.5倍的速度增加,3增加到4而不是4.5,是因為取整的原因。

那么為什么要這樣處理,主要有兩個原因:

1、vector在push_back以成倍增長可以在均攤后達到O(1)的事件復雜度。具體的推理過程涉及到算法分析與一些數學知識,在此不再傲述,感興趣的話,可留言。

2、考慮可能產生的堆空間浪費,成倍增長倍數不能太大,為了防止申請內存的浪費,現在使用較多的有2倍與1.5倍的增長方式,而1.5倍的增長方式可以更好的實現對內存的重復利用。

至于問題中的為什么不在vector結尾處申請內存,那是因為每次申請的內存由系統決定,程序和編譯器并不能控制。

java中數組擴容方法,back擴容機制為什么不考慮在尾元素后面的空間申請內存