[英]How does an allocator work with std::vector?
我在 cppreference 上查看vector::vector的文檔,作為練習,我試圖弄清楚如何實現explicit vector( const Allocator& alloc ) noexcept;
我發現問自己的問題是,為什么要將分配器傳遞給向量? 只有在分配器是多態的情況下才有意義。 但是,如果該組分配器具有不同的狀態信息,即具有不同的大小,則會導致以下問題:
那么,鑒於這些原因,這是否意味着分配器組必須僅在基類中具有狀態? 還有什么我想念的嗎?
如果您沒有它作為成員,則必須對其進行分配。 分配意味着它可能導致異常。
不,它不必分配。 要構造std::vector
的實例,只需對其進行復制構造即可。
分配器實例作為const
引用傳遞給std::vector
的構造函數。 std::vector
本身有一個Allocator
實例作為(私有)類成員,它是從這個參數復制構造的。
請記住, Allocator
是第二個(默認) std::vector
模板參數。 因此,典型的實現將Allocator
聲明為std::vector
本身的(私有)成員,因此發生的唯一分配是std::vector
本身的分配。
std::vector
默認構造函數默認構造它的Allocator
類成員,它也是noexcept
(從 C++17 開始)。
所以膠囊總結是分配器類(從 C++17 開始)必須有一個noexcept
復制構造函數和一個noexcept
默認構造函數,它為了滿足std::vector
本身的noexcept
異常要求。
作為構造std::vector
實例的一部分(對於不將std::vector
的內容作為其構造的一部分進行初始化的構造函數)的一部分,不需要進行額外的分配——除了std::vector
的分配std::vector
本身。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.