當我們push_back使用時會發生什么size() == capacity()時會發生什么?
關于這個問題,我聽到了很多意見。最流行的是:當 vector 的大小達到其容量時,它分配一個新的記憶體區域,將 vector 復制到新分配的記憶體中,并將新值插入到 vector 的末尾。
但是,為什么我們必須這樣做?我們有一個虛擬記憶體機制,我們可以呼叫realloc(vec.data(), (sizeof(vec::value_type) * vec.size()) * 2). 這Allocator將為我們提供一個新的記憶體頁面,虛擬地址使記憶體“一致”,因此我們不必從向量中復制值。
我對虛擬記憶體機制的理解有誤嗎?
uj5u.com熱心網友回復:
您正確理解虛擬記憶體機制,基本上您可以在行程的虛擬記憶體空間中創建任意數量的連續頁面對齊陣列,并且它們將由非連續物理記憶體支持。
但這無關緊要,std::vector因為std::allocator沒有提供任何 API 來利用它,我認為有些人認為這是一種疏忽。
請注意,C 不僅限于支持虛擬記憶體的體系結構,盡管我認為如果無論如何實作它,它將成為標準庫的實作細節。
不,您不能使用 C realloc,因為 C 具有具有真實生命周期的物件,一切都不僅僅是可以隨心所欲地自由復制的位元組塊,一些特殊的塊可能不喜歡被移動,如果您強迫它們移動,它們將不會欣賞。
是的,如果您正在處理 POD,這將適用于custom::vector,而不是std::vector基于std::allocator.
作品中有一篇論文解決了您的擔憂并超越realloc了它,認為“它的日子已經過去了” - P0901,幾天前從委員會收到了相當積極的反饋。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/534080.html
