簡體   English   中英

為什么我們需要使用folly :: fbvector而不是std :: vector with allocator最初保留大的uncommited區域?

[英]Why do we need to use folly::fbvector instead of std::vector with allocator which reserve large uncommited area initially?

眾所周知,如果我們將push_back元素添加到std::vector<> ,並且如果向量中分配的整個內存被占用,則std::vector<>保留當前內存大小的2倍(分配2X大小的新內存) ,調整向量並將舊數據復制到新內存。

我們可以優化它,Facebook在愚蠢的庫中完成這個(FBVector是Facebook的std :: vector的實現。它具有與可重定位類型和jemalloc https://github.com/facebook/folly/一起使用的特殊優化。 blob / master / folly / FBVector.h#L21 )。

即當vector<>沒有足夠的內存來推送新元素時,我們會分配更多內存但不會分配2倍(不同次數: 1.3 - 1.5倍

說明: https//github.com/facebook/folly/blob/master/folly/docs/FBVector.md

下面的圖形解算器顯示選擇k = 1.5(藍線)允許在4次重新分配后重復分配存儲器,選擇k = 1.45(紅線)允許在3次重新分配后重復使用存儲器,並且選擇k = 1.3(黑線)允許僅在2次重用后重復使用重新分配。

在此輸入圖像描述

但是為什么我們需要使用使用VirtualAllocEx()自定義分配器來使用folly::fbvector<>而不是std::vector<> (如下所示: 我需要使用VirtualAlloc / VirtualAllocEx? ),或者同樣在linux https://stackoverflow.com/a/2782910/1558037 ,其中:

  • std::vector<>::reserve() - 最初保留虛擬地址的大型未提交區域(分配WMA,但不在PT中分配任何PTE),例如,最初分配16 GB的虛擬區域,每次缺少內存來提交內存(分配PTE - 分配物理區域)等於1 x SIZE的向量
  • std::vector<>::resize() - 然后只提交一批新的頁面,在PT中只分配新的PTE,不重新分配已經使用的內存,也不將數據從舊內存復制到新內存

整體

這種方法的優點是在folly::vector<>有大的未提交區域: 我們總是只分配新的內存部分而不會復制舊數據。

folly::vector<>方法優於std::vector<>的優點: 有時我們不需要分配新內存 ,但應始終將舊數據復制到新內存中。

這是特定於實現的。 GCC庫確實分配了兩倍,但Visual C ++沒有。 我相信,它也使用1.5,但不確定。

我相信, folly應該是與操作系統無關的,你的方法是Windows / Linux特有的。

如果您仔細選擇類型,那么從舊向量移動到新向量的對象應該不那么糟糕 - 也就是說,使用std::unique_ptr作為數據類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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