vector記憶體分配簡單介紹

2022-05-09 20:16:59 字數 1263 閱讀 8546

眾所周知,vector的size()其實並不代表它占用的空間,它實際占用空間可以用capacity()檢視

眾所周知,push_back()時,如果size==capacity則會使capacity從0變1或者變為原來兩倍,當然如果size眾(gui)所(cai)周(zhi)知(dao),一旦觸發記憶體分配,原來的指標或者迭代器失效,因為vector的所有內容搬遷到新的記憶體裡了

你可能覺得push_back()奇慢無比,那倒也不至於,因為平均下來push_back()複雜度確實是 \(o(1)\)

當然慢也是有一定道理的,因為如果直接用vector陣列作為鄰接表來存圖,效率並不理想

比如我們定義了vectora[100010];,隨機建邊的時候就會瘋狂觸發記憶體分配導致愉快地tle(不過圖論題這麼毒瘤的也不常見)

解決方法是前向星或者手寫分配器。如果不手寫分配器用list替代vector貌似更慢了(雖然我也不知道為什麼,另外forward_list和vector差不多的亞子)

眾(gui)所(cai)周(zhi)知(dao),不止push_back(),像resize(),reserve()等都會觸發記憶體分配

眾(gui)所(cai)周(zhi)知(dao),像clear(),pop_back()等並不會釋放記憶體(也就不會使capacity變小),只有shrink_to_fit()等少數幾個操作才能使capacity變小。因此有些不得已的情況會用a=vector()來代替a.clear()

當然也有可能a.clear()導致mle,a=vector()導致tle(笑)

眾(gui)所(cai)周(zhi)知(dao),vector對記憶體分配的惰性其實是為了效率考慮的,它很好地規避了頻繁的分配釋放空間。vector滿足了很多常見需求。但是像圖論等某些地方還是不能偷懶,還得花點功夫寫分配器,或者用前向星、手寫queue這種樸素方法代替stl

手寫分配器的方法如下:

static char space[10000000],*sp=space;

templatestruct allc:allocator

templateallc(const allc&a){}

templateallc& operator=(const allc&a)

templatestruct rebind;

inline t* allocate(size_t n)

inline void deallocate(t* p,size_t n){}

};vector< int,allc> a;

vector的記憶體分配

stl中有個很重要的東西就是vector,開發中會經常用到,至少我是經常使用,vector的存在可以使開發者不必關心記憶體的申請和釋放。但是,vector的乙個缺點就是它的記憶體分配是按照2的倍數分配記憶體的。當當前容量對插入元素不夠時,分配一塊新的記憶體,這塊記憶體的容量是原vector容量的2倍...

vector 的記憶體分配問題

vector 有乙個機制是這樣的,如果新加入乙個元素,如果size 大於了capacity,那麼vector 就會重新找一塊更大的地方再把資料放進去,下面進入除錯 這是原本vector首個元素的位址,這時size 和capacity 都是1,下面新增乙個元素讓size大於capacity 可以看到當...

vector記憶體的分配與釋放

1.vector的記憶體增長 vector其中乙個特點 記憶體空間只會增長,不會減小,援引c primer 為了支援快速的隨機訪問,vector容器的元素以連續方式存放,每乙個元素都緊挨著前乙個元素儲存。設想一下,當vector新增乙個元素時,為了滿足連續存放這個特性,都需要重新分配空間 拷貝元素 ...