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結尾處申請內存,那是因為每次申請的內存由系統決定,程序和編譯器并不能控制。
上一篇電子商務的主干課程有什么
下一篇平湖十大羽絨服品牌