簡體   English   中英

分配器如何與 std::vector 一起工作?

[英]How does an allocator work with std::vector?

我在 cppreference 上查看vector::vector的文檔,作為練習,我試圖弄清楚如何實現explicit vector( const Allocator& alloc ) noexcept;

我發現問自己的問題是,為什么要將分配器傳遞給向量? 只有在分配器是多態的情況下才有意義。 但是,如果該組分配器具有不同的狀態信息,即具有不同的大小,則會導致以下問題:

  1. 您不能只將分配器作為成員/基類,因為在復制時會導致對象被切片。
  2. 如果您沒有它作為成員,則必須對其進行分配。 分配意味着它可能導致異常。

那么,鑒於這些原因,這是否意味着分配器組必須僅在基類中具有狀態? 還有什么我想念的嗎?

如果您沒有它作為成員,則必須對其進行分配。 分配意味着它可能導致異常。

不,它不必分配。 要構造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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM